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 处理器应引发异常。
从技术层面讲,XAML 属性用法 <x:Arguments>string</x:Arguments>
是可能的。 但是,除了可以通过初始化文本和类型转换器执行操作之外,这不提供任何其他功能,并且使用此语法不是 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>