XAML x:Key="{x:Type TextBox}”的作用是什么?

n9vozmp4  于 2023-03-21  发布在  其他
关注(0)|答案(4)|浏览(99)

一切都在标题中:
我不止一次地读到过这样一种风格:

<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中定义的,但我实际上是在我的代码后面将控件添加到布局中,因为它们是动态添加的。可能是麻烦所在...

ohfgkhjo

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}"之间的结果是否存在差异?)

wj8zmpe1

wj8zmpe12#

现在,您可以通过添加以下项来层叠样式:

BasedOn="{StaticResource {x:Type ComboBox}}"

在本文件的更下方,例如:

<Window.Resources>
     <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
          <Setter Property="HorizontalContentAlignment" Value="Left"/>
          <Setter Property="VerticalContentAlignment" Value="Center"/>
      </Style>
</Window.Resources>
<StackPanel>
    <TextBox>I'm Left-Center</TextBox>
    <Grid>
        <Grid.Resources>
           <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                <Setter Property="HorizontalContentAlignment" Value="Right"/>
            </Style>
        <Grid.Resources>
        <TextBox>I'm Right-Center</TextBox>
    </Grid>
</StackPanel>
pinkon5k

pinkon5k3#

每个资源都需要一个键,但是如果样式中省略了Key,它应该默认为TargetType的类型,所以上面的两个代码段应该是等价的。
如果没有明确的Key定义,您是否可以发布整个代码?

nszi6y05

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类型作为样式或数据触发器的目标类型。

相关问题