【发布时间】:2011-08-30 10:46:54
【问题描述】:
以下 TargetType 规范有什么区别?
1.
<Style TargetType="{x:Type Button}" ...
2.
<Style TargetType="Button" ...
似乎两者都可以正常工作。
【问题讨论】:
-
对不起,我搜索了答案,但什么也没找到
以下 TargetType 规范有什么区别?
1.
<Style TargetType="{x:Type Button}" ...
2.
<Style TargetType="Button" ...
似乎两者都可以正常工作。
【问题讨论】:
在第一个示例中,Type 标记扩展创建了一个由给定字符串指定的Type 实例,即Button。
在第二个示例中,与TargetType 属性关联的类型转换器将字符串"Button" 转换为所需的Type。
两者的结果完全相同。值得注意的是,在 Silverlight 中,Type 标记扩展不存在,因此只有 (2) 是可能的。
【讨论】:
很抱歉戳了这么一个老帖子,但我觉得这是值得的。我最近遇到一个情况,显示 x:Type 与 TypeName-as-String 不同。根据我的经验-
x:Type 考虑强名称或程序集的版本,但不考虑 TypeName-as-String。
我已经在我的博客中解释了我的场景和其他细节 -
除此之外,WPF 推断类型的方式也有所不同。 x:Type 使用 TypeExtension,而 TypeName-as-String 使用 FrameworkElementFactory。
根据 MSDN -
支持 Typename-as-String 的类型属性
WPF 支持能够指定某些值的技术 Type 类型的属性,无需 x:Type 标记扩展 用法。相反,您可以将值指定为命名 类型。这方面的例子是 ControlTemplate.TargetType 和 样式.目标类型。不通过以下方式提供对此行为的支持 类型转换器或标记扩展。相反,这是一个 通过 FrameworkElementFactory 实现的延迟行为。
【讨论】: