x:Key =“{x:Type TextBox}”是做什么的?

时间:2011-02-01 08:36:58

标签: wpf xaml syntax

一切都在标题中:

我不止一次地阅读过设置这样的风格:

<Style TargetType="TextBox">...</Style>

大致相当于:

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

(上次in a comment on another question

两者都应该将样式应用于应用程序中的所有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得到的绑定问题。第一个代码工作正常,但第二个代码没有。

通过将horizo​​ntalContentAlignment设置为Right

,您可以轻松地看到这一点

编辑2:此代码只是放在App.xaml的资源字典中。用TargetType =“ComboBoxItem”替换TargetType =“{x:Type ComboBoxItem}”没有任何区别

编辑3:我刚才意识到我可能忘记了确切的重要内容(对不起):虽然样式是在xaml中定义的,但我实际上是将控件添加到我的代码后面的布局中因为它们是动态添加的。可能是麻烦所在......

3 个答案:

答案 0 :(得分:9)

  

如上面的第一个例子所示,   将TargetType属性设置为   TextBlock没有指定样式   使用x:Key可以让你的风格   应用于所有TextBlock元素。   实际发生的是这样做   隐式地将x:Key设置为{x:Type   TextBlock的}。这也意味着如果   你给Style一个x:Key值   除{x:Type之外的任何其他内容   TextBlock},Style不会   应用于所有TextBlock元素   自动。相反,你需要   将样式应用于TextBlock   元素明确。

考虑到这是from the official documentation,您的问题必须是异常。我已经看到了一些这样的奇怪之处,因为WPF背后的编码肯定是不完美的,所以它们并不是太出乎意料。

(如果省略该键,TargetType="ComboBoxItem"TargetType="{x:Type ComboBoxItem}"之间的结果是否存在差异?)

答案 1 :(得分:4)

现在,您可以通过添加:

来级联样式
BasedOn="{StaticResource {x:Type ComboBox}}"
&lt; Style /&gt;中的

在文档的下方,例如:

<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>

答案 2 :(得分:2)

每个资源都需要一个键,但如果样式省略Key,则它应默认为TargetType的类型。因此,上面的两个片段应该是等效的。

如果没有明确的Key定义,您是否可以将整个代码发布到哪里?