何时使用{x:Type ...}?

时间:2012-06-23 06:51:15

标签: .net wpf xaml targettype

有什么区别:

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

和:

<Style TargetType="Border">

何时以及为何需要使用{x:Type …}

5 个答案:

答案 0 :(得分:12)

效果没有区别;在两种情况下,TargetType属性都将设置为typeof(Border)

WPF的第一个版本需要第一个版本{x:Type Border},因为编译器没有使用TypeConverter类将字符串转换为Type对象,您需要指定{{1} }为你做这件事。

如果我没记错的话,第二个版本是用Silverlight引入的,很快就找到了WPF编译器。

修改

我对TypeExtension课程的假设是错误的;这是由TypeConverter

实现的

来自the documentation

  

键入支持Typename-as-String的属性

     

WPF支持允许指定某些值的技术   类型Type的属性,不需要x:Type标记扩展名   用法。相反,您可以将值指定为命名的字符串   类型。这方面的例子是ControlTemplate.TargetType和   Style.TargetType。不提供对此行为的支持   无论是类型转换器还是标记扩展。相反,这是一个   通过FrameworkElementFactory实现的延迟行为。

     

Silverlight支持类似的约定。事实上,Silverlight确实如此   目前在XAML语言支持中不支持{x:Type},并且支持   在一些情况之外不接受{x:Type}用法   旨在支持WPF-Silverlight XAML迁移。因此,   typename-as-string行为内置于所有Silverlight本机   属性评估,其中Type是值。

答案 1 :(得分:4)

虽然在给定的示例中没有区别,但实际上x:TypeTypeName-as-String之间存在差异。

我最近遇到的情况表明, x:Type 与自定义类型的 TypeName-as-String 不同。根据我的经验 -

x:Type 会考虑程序集的强名称或版本(在哪种类型中驻留)但不考虑 {{1} }

我已经在我的博客中解释了我的情景和其他细节 -

Importance of specifying AncestorType with x:Type in RelativeSourceBinding

除此之外,WPF推断类型的方式也有所不同。使用 TypeName-as-String x:Type,而使用 TypeExtension TypeName-as-String(如Erno所述)。

答案 2 :(得分:2)

将此属性(TargetType)设置为Border而不使用x:Key指定样式允许将样式应用于所有Border元素。 但是,当您将x:Key设置为{x:Type Border}时,这意味着如果您为Style提供除x:Key以外的任何值的{x:Type Border},则{{1}不会自动应用于所有Border元素。相反,您需要明确地将样式应用于Border元素。

答案 3 :(得分:1)

两者完全相同。在任何一种情况下,您的风格仅适用于Border

答案 4 :(得分:0)

如果您正在使用XAML 2009,则可以将x:Key指定为元素,以显式支持由字符串以外的对象类型键入的字典,而无需标记扩展中间。请参阅本主题中的“XAML 2009”部分。备注部分的其余部分特别适用于XAML 2006实现。

x:Key的属性值可以是XamlName语法中定义的任何字符串,也可以是通过标记扩展名评估的对象。有关WPF的示例,请参阅“WPF使用说明”。

作为IDictionary实现的父元素的子元素通常必须包含x:Key属性,该属性指定该字典中的唯一键值。 Frameworks可能会实现别名键属性来替换特定类型的x:Key;定义此类属性的类型应归入DictionaryKeyPropertyAttribute。

相当于指定x的代码:Key是用于底层IDictionary的键。例如,当您在代码中将资源添加到WPF ResourceDictionary时,在WPF中的资源标记中应用的x:Key等效于ResourceDictionary.Add的key参数的值。 x:Type标记扩展具有与C#中的typeof()运算符或Microsoft Visual Basic中的GetType运算符类似的函数。

x:Type标记扩展为采用Type类型的属性提供from-string转换行为。输入是XAML类型。输入XAML类型和输出CLR类型之间的关系是输出类型是输入XamlType的UnderlyingType,在查找基于XAML模式上下文的必要XamlType和上下文提供的IXamlTypeResolver服务之后。

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

在特定的框架实现中,将Type作为值的某些属性可以直接接受类型的名称(Name类型的字符串值)。但是,实现此行为是一个复杂的方案。有关示例,请参阅后面的“WPF使用说明”部分。

属性语法是此标记扩展使用的最常用语法。在x:Type标识符字符串之后提供的字符串标记被指定为基础TypeExtension扩展类的TypeName值。在基于CLR类型的.NET Framework XAML服务的默认XAML架构上下文中,此属性的值是所需类型的名称,或者包含该名称前面带有非默认XAML名称空间映射的前缀

x:Type标记扩展可用于对象元素语法。在这种情况下,需要指定TypeName属性的值才能正确初始化扩展名。

x:Type标记扩展也可以用作详细属性;但这种用法并不典型: