WPF样式:x:Name和x:Type之间的区别

时间:2010-01-29 14:13:18

标签: wpf styles

在资源字典中定义样式时,您可以使用

x:Name="xyz"

x:Type="xyz". 

并且可以在XAML中引用此样式,如{StaticResource xyz}。

大多数示例使用'x:Key','name'和'key'之间的区别在于使用'x:name'可以让您使用此样式定义代码隐藏?

FIXES: 这个问题完全错了。打算要问的是x:Key和x:Name之间的区别。但是我自己并没有尝试这个代码,而只是依赖于记忆 - 我认为我在ResourceDictionary中都有这个,这是错误的。

我也没有这样的代码
 <xxx.Resources > 

部分,因为它也不起作用。你不能引用没有x:Key的样式(x:Name在这里不起作用),并且添加两个不带x的样式:Key抛出异常,因为它们在字典中都得到相同的(空?)键。 p>

Ray非常好地表达了所有的不同,谢谢 我的错?

2 个答案:

答案 0 :(得分:9)

这是一个技巧问题。事实上,你无法使用

在ResourceDictionary中定义样式
x:Type="xyz"

x:Name="xyz"

区别在于:

  • x:Type="xyz"无效XAML语法。
  • x:Name="xyz"实际上是有效的XAML语法,用于命名对象(这会影响代码隐藏的生成)但不提供字典键。
  • x:Key="xyz"也是有效的XAML语法,它提供字典键但不命名对象。

在字典中需要一个密钥,因此您必须指定x:Key(除了对于FrameworkTemplate及其子类,可以从TargetType或DataType推断出密钥)。在字典中,如果需要,您还可以指定x:Name,但不会影响密钥。

请注意,x:Type是由XAML预定义的标记扩展,而x:Namex:Key是实际的XAML关键字。因此x:Type只能在标记扩展语法中用作属性的值:

something="{x:Type whatever}"

x:Namex:Key是可以在元素上使用的属性。

答案 1 :(得分:2)

x:Name允许您创建可以按名称使用的引用。

x:type允许您创建该类型使用的引用

例如

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

创建一个会自动影响按钮的样式