样式TargetType属性问题

时间:2011-08-30 10:46:55

标签: .net wpf xaml styles

以下TargetType规范之间有什么区别?

1

<Style TargetType="{x:Type Button}" ...

2

<Style TargetType="Button" ...

看起来两者都很好。

2 个答案:

答案 0 :(得分:3)

在第一个示例中,Type标记扩展名创建了由给定字符串指定的Type实例,即Button

在第二个示例中,与TargetType属性关联的类型转换器会将字符串"Button"转换为所需的Type

两者都给出完全相同的结果。值得注意的是,在Silverlight中,Type标记扩展名不存在,因此(2)只有可能。

答案 1 :(得分:1)

很抱歉找到这样一个老线程,但我觉得这是值得的。我最近遇到的情况表明 x:Type TypeName-as-String 不同。根据我的经验 -

x:类型会考虑程序集的强名称或版本,但不会考虑 TypeName-as-String

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

http://weblogs.asp.net/akjoshi/archive/2012/02/03/importance-of-specifying-ancestortype-with-x-type-in-relativesourcebinding.aspx

除此之外,WPF推断类型的方式也有所不同。对于 x:Type 使用TypeExtension,而对于 TypeName-as-String 使用FrameworkElementFactory。

根据MSDN -

  

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

     

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

http://msdn.microsoft.com/en-us/library/ms753322.aspx