当使用{x:类型...}?(when to use {x:Type …}?)

2019-06-25 17:28发布

是什么区别:

<Style TargetType="{x:Type Border}">

和:

<Style TargetType="Border">

当和为什么我需要使用{x:Type …}

Answer 1:

有实际上没有什么区别; 在这两种情况下的TargetType属性将被设置为typeof(Border)

第一个版本{x:Type Border}需要在WPF的第一个版本,因为编译器不使用TypeConverter类将字符串转换成一个类型的对象,你需要指定TypeExtension类来为你做的。

第二个版本推出时,如果我没有记错,使用Silverlight并迅速找到了自己的WPF编译器的方式。

编辑

我的假设TypeConverter类是错误的; 这是由实现FrameworkElementFactory

从文档 :

类型属性,支持类型名,为字符串

WPF支持,使指定类型类型的一些属性的值,而不需要的x技术:类型标记扩展的使用。 相反,你可以指定值作为字符串名称类型。 这方面的例子是ControlTemplate.TargetType和Style.TargetType。 不通过任一类型的转换器或标记扩展提供针对此行为的支持。 相反,这是通过FrameworkElementFactory实施推迟的行为。

Silverlight支持类似的约定。 事实上,Silverlight中目前不支持{X:类型}在XAML语言的支持,并且不接受:那是为了支持WPF,Silverlight的XAML移植的一些情况外{X}型用途。 因此,类型名称,作为字符串行为是内置于所有的Silverlight原生属性的评估,其中一类是值。



Answer 2:

虽然在给定的例子并没有区别,但实际上是有区别x:TypeTypeName-as-String

我最近遇到的情况这表明x:Type是不同的TypeName-as-String ,当涉及到自定义类型。 从我的经验 -

x:Type认为强名称或组件的版本(其中驻留型),但不TypeName-as-String

我已经解释了我的情况和其他细节在这里我的博客 -

在RelativeSourceBinding类型:与X指定AncestorType的重要性

除此之外,也有在WPF如何推断类型差异。 对于x:Type TypeExtension被使用,而对于TypeName-as-String FrameworkElementFactory被使用(如艾尔诺提到的)。



Answer 3:

设置该属性( TargetType )边境不与分配样式x:Key允许样式被应用到所有的边界元素。 但是,当你设置x:Key{x:Type Border} ,这意味着,如果你给的Stylex:Key的不是其他任何值{x:Type Border}Style将不会适用于所有边界元素自动。 相反,你需要将样式应用到边界元素明确。



Answer 4:

两者都完全相同。 在任何一种情况下你的风格将适用于Border而已。



Answer 5:

如果使用的是2009年XAML,X:键可以指定为一个元素,以明确地支持由不是字符串其他对象类型键控字典而无需标记扩展中间。 请参阅本主题中的“XAML 2009”一节。 在备注部分的剩余部分特别适用于2006年的XAML实现。

x的属性值:键可以在XamlName语法定义的任何串,或者可以是通过标记扩展进行评价的对象。 请参阅“WPF使用说明”从WPF的例子。

即一个IDictionary实现父元素的子元素通常必须包括x:关键属性,指定该字典内的唯一密钥值。 框架有可能实现走样的关键属性来取代X:对特定类型的关键; 定义这样的属性类型应该与DictionaryKeyPropertyAttribute归因。

该代码相当于指明x:密钥是用于底层的IDictionary的关键。 例如,X:当你在代码中添加资源的WPF ResourceDictionary的是在标记应用在WPF资源键等同于ResourceDictionary.Add的关键参数的值。 在X:类型标记扩展也有类似的功能,在C#中的typeof()运算符或在Microsoft Visual Basic中的GetType操作。

在x:类型标记扩展提供该走类型类型性质的从字符串的转换的行为。 输入是XAML类型。 输入XAML类型和输出类型CLR之间的关系是,输出类型是输入XamlType的UnderlyingType,仰视基于XAML架构上下文和IXamlTypeResolver服务上下文提供了必要的XamlType之后。

在.NET框架XAML服务,该标记扩展的处理由TypeExtension类中定义。

在具体的框架实现中,一些属性类型采取作为一个值可以接受直接类型的名称(类型名称的字符串值)。 然而,实现这种行为是一个复杂的场景。 举例来说,看到后面的“WPF使用注意事项”一节。

属性的语法与此标记扩展中最常用的语法。 在x之后提供的字符串标记:类型标识符字符串被分配作为底层TypeExtension扩展类的类型名的值。 下的.NET Framework XAML服务,这是基于CLR类型的默认XAML架构方面,该属性的值是所期望的类型的名称,或包含名称由非默认XAML命名空间映射一个前缀在前。

在x:类型标记扩展可以在对象元素的语法被使用。 在这种情况下,指定类型名属性的值需要适当地初始化扩展。

在x:类型标记扩展也可以使用作为详细的属性; 然而这种使用是不典型:



文章来源: when to use {x:Type …}?