一切都在标题中:
我不止一次地读到过这样一种风格:
<Style TargetType="TextBox">...</Style>
大致相当于:
<Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style>
(last时间在另一个问题的评论)
两者都应该将样式应用于应用中的所有textBox(当然,如果它们被放在应用的资源中)
但是我在我的应用程序中两个都试过了,只有第二个定义了x:Key的能用。
对我来说,这看起来很合乎逻辑,因为第一个语法不知道在没有任何x:Key属性集的情况下应用到哪里,但是第一个语法的意义是什么呢?
**编辑:**我的应用程序中运行良好的代码示例:
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
而代码不:
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
我写这段代码是为了解决当你操作一个已经存在的ComboBox的itemsSource时comboBoxItems的绑定问题,第一段代码运行良好,但是第二段代码不行。
通过将horizontalContentAlignment设置为“右对齐”,可以很容易地看到这一点
**编辑2:**这段代码只是放在App. xaml的资源字典中。用TargetType=“ComboBoxItem”替换TargetType="{x:Type ComboBoxItem}”没有任何区别
**编辑3:**我刚刚意识到我可能忘记了精确一些重要的东西(抱歉):虽然样式是在xaml中定义的,但我实际上是在我的代码后面将控件添加到布局中,因为它们是动态添加的。可能是麻烦所在...
4条答案
按热度按时间ohfgkhjo1#
如上面的第一个示例所示,如果将TargetType属性设置为TextBlock而不为样式分配x:Key,则可以将样式应用于所有TextBlock元素。实际情况是,这样做会将x:Key隐式设置为{x:Type TextBlock}。这也意味着,如果为Style提供的x:Key值不是{x:Type TextBlock},则不会将Style自动应用于所有TextBlock元素。相反,您需要将样式显式应用于TextBlock元素。
考虑到这是来自官方文档,您的问题必须是一个异常。我已经看到了一些这样的奇怪,他们并不都太意外,因为WPF背后的编码肯定是不完美的。
(Is如果省略密钥,
TargetType="ComboBoxItem"
和TargetType="{x:Type ComboBoxItem}"
之间的结果是否存在差异?)wj8zmpe12#
现在,您可以通过添加以下项来层叠样式:
在本文件的更下方,例如:
pinkon5k3#
每个资源都需要一个键,但是如果样式中省略了
Key
,它应该默认为TargetType
的类型,所以上面的两个代码段应该是等价的。如果没有明确的
Key
定义,您是否可以发布整个代码?nszi6y054#
在WPF XAML中,
TargetType="TextBox"
和TargetType="{x:Type TextBox}"
都有效且等效。x:Type
标记扩展用于指定Type
对象的值。在本例中,它指定的是类型TextBox
。它通常用于XAML中指定控件的类型,如在样式或数据触发器的TargetType
属性中。使用
TargetType="TextBox"
是WPF为简化最常用方案的标记而提供的快捷方式。此语法隐式为TextBox
类型创建TypeExtension
。因此,
TargetType="TextBox"
和TargetType="{x:Type TextBox}"
将具有相同的结果,即指定TextBox
类型作为样式或数据触发器的目标类型。