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

7
在资源字典中定义样式时,您可以使用以下任一种方法:
x:Name="xyz"

并且

x:Type="xyz". 

可以在XAML中使用{StaticResource xyz}引用此样式。

大多数示例使用“x:Key”,而“name”和“key”的区别在于,使用“x:name”可以让您在代码后台使用此样式定义?

修复: 问题完全错误。本意是询问x:Key和x:Name之间的区别。但我没有尝试过这段代码,只是依靠记忆 - 认为我在ResourceDictionary中都有它们,这是错误的。而且我也没有这样的代码。

 <xxx.Resources > 

由于它同样不起作用,所以不能引用没有x:Key的Style(在此处x:Name无效),而且添加两个没有x:Key的样式会抛出异常,因为两个样式在字典中得到相同(空?)的键。

Ray以非常好的方式表达了所有的区别,谢谢。
是我的错


这是一个诡计问题。 - Ray Burns
2个回答

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:Name` 和 `x:Key` 是实际的 XAML 关键字。因此,`x:Type` 只能在标记扩展语法中作为属性值使用:
something="{x:Type whatever}"

x:Namex:Key是可以用于元素的属性。


2
这是一个双重的恶作剧问题,因为实际上两者都不起作用。您也无法在ResourceDictionary中使用x:Name ="xyz"定义样式,只有x:Key可以使用。 - itowlson
不开玩笑!我怎么会错过那个?现在我该怎么办?删除我的答案吗?还是修改它?我想我会修改它。谢谢itowlson。 - Ray Burns
感谢您的回复。请告诉我是否应该删除这个问题,或者编辑它的文本以使其不会引起困惑。 - bybor

2

x:Name允许您创建一个可以通过名称使用的引用。

x:type允许您创建一个根据该类型使用的引用。

例如

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

创建一个样式,它将自动影响按钮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接