有什么区别:
<Style TargetType="{x:Type Border}">
和:
<Style TargetType="Border">
何时以及为何需要使用{x:Type …}
?
答案 0 :(得分:12)
效果没有区别;在两种情况下,TargetType属性都将设置为typeof(Border)
WPF的第一个版本需要第一个版本{x:Type Border}
,因为编译器没有使用TypeConverter
类将字符串转换为Type对象,您需要指定{{1} }为你做这件事。
如果我没记错的话,第二个版本是用Silverlight引入的,很快就找到了WPF编译器。
修改强>
我对TypeExtension
课程的假设是错误的;这是由TypeConverter
:
键入支持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:Type
和TypeName-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标记扩展也可以用作详细属性;但这种用法并不典型: