x:Arguments 指令
打包 XAML 中非无参数构造函数对象元素声明或工厂方法对象声明的构造参数。
XAML 元素用法(非参数构造函数)
<object ...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
XAML 元素用法(工厂方法)
<object x:FactoryMethod="methodName"...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
XAML 值
价值 | 描述 |
---|---|
oneOrMoreObjectElements |
一个或多个对象元素,指定要传递给支持非无参数构造函数或工厂方法的参数。 典型的用法是使用对象元素中的初始化文本来指定实际参数值。 请参阅“示例”部分。 元素的顺序非常重要。 按顺序排列的 XAML 类型必须与后盾构造函数或工厂方法重载的类型和类型顺序匹配。 |
methodName |
应处理任何 x:Arguments 参数的工厂方法的名称。 |
依赖
x:FactoryMethod
可以修改应用 x:Arguments
的范围和行为。
如果未指定 x:FactoryMethod
,则 x:Arguments
适用于后备构造函数的备用(非默认)签名。
如果指定了 x:FactoryMethod
,则 x:Arguments
适用于命名方法的重载。
言论
XAML 2006 可以通过初始化文本支持非默认初始化。 但是,初始化文本构造技术的实际应用有限。 初始化文本被视为单个文本字符串;因此,它只会为单个参数初始化添加功能,除非为可以分析字符串中的自定义信息项和自定义分隔符的构造行为定义类型转换器。 此外,对象逻辑的文本字符串可能是给定的 XAML 分析器的本机默认类型转换器,用于处理除真实字符串以外的基元。
x:Arguments
XAML 用法不是典型意义上的属性元素用法,因为指令标记不引用包含的对象元素的类型。 它更类似于其他指令,例如 x:Code
元素将标记应解释为子内容的默认值以外的范围。 在这种情况下,每个对象元素的 XAML 类型传达有关参数类型的信息,XAML 分析器使用该类型来确定 x:Arguments
用法尝试引用的特定构造函数工厂方法签名。
要构造的对象元素 x:Arguments
必须位于对象元素的任何其他属性元素、内容、内部文本或初始化字符串之前。
x:Arguments
中的对象元素可以包括属性和初始化字符串,该 XAML 类型及其后盾构造函数或工厂方法允许。 对于对象或参数,可以通过引用已建立的前缀映射来指定默认 XAML 命名空间之外的自定义 XAML 类型或 XAML 类型。
XAML 处理器使用以下准则来确定 x:Arguments
中指定的参数如何用于构造对象。 如果指定了 x:FactoryMethod
,则会将信息与指定的 x:FactoryMethod
进行比较(请注意,x:FactoryMethod
的值是方法名称,命名方法可以具有重载。 如果未指定 x:FactoryMethod
,则会将信息与对象的所有公共构造函数重载集进行比较。 然后,XAML 处理逻辑将参数数进行比较,并选择具有匹配 arity 的重载。 如果有多个匹配项,XAML 处理器应根据提供的对象的元素的 XAML 类型比较参数的类型。 如果仍有多个匹配项,则未定义 XAML 处理器行为。 如果指定了 x:FactoryMethod
但无法解析该方法,则 XAML 处理器应引发异常。
从技术上可以 <x:Arguments>string</x:Arguments>
使用 XAML 属性。 但是,除了通过初始化文本和类型转换器可以执行的操作之外,这不提供任何功能,并且使用此语法并不是 XAML 2009 工厂方法功能的设计意图。
例子
以下示例演示了一个非无参数构造函数签名,然后显示了访问该签名的 x:Arguments
的 XAML 用法。
public class Food {
private string _name;
private Int32 _calories;
public Food(string name, Int32 calories) {
_name=name;
_calories=calories;
}
}
<my:Food>
<x:Arguments>
<x:String>Apple</x:String>
<x:Int32>150</x:Int32>
</x:Arguments>
</my:Food>
下面的示例演示了目标工厂方法签名,然后显示了访问该签名的 x:Arguments
的 XAML 用法。
public Food TryLookupFood(string name)
{
switch (name) {
case "Apple": return new Food("Apple",150);
case "Chocolate": return new Food("Chocolate",200);
case "Cheese": return new Food("Cheese", 450);
default: {return new Food(name,0);
}
}
<my:Food x:FactoryMethod="TryLookupFood">
<x:Arguments>
<x:String>Apple</x:String>
</x:Arguments>
</my:Food>