Wpf x:Key=";{x:Type TextBox}";做

Wpf x:Key=";{x:Type TextBox}";做,wpf,xaml,syntax,Wpf,Xaml,Syntax,所有内容都在标题中: 我不止一次读到过这样的设置风格: <Style TargetType="TextBox">...</Style> 。。。 大致相当于: <Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style> 。。。 (上次) 两者都应将样式应用于应用程序中的所有文本框(当然,如果它们放在应用程序的资源中

所有内容都在标题中:

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

<Style TargetType="TextBox">...</Style>
。。。
大致相当于:

<Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style>
。。。
(上次)

两者都应将样式应用于应用程序中的所有文本框(当然,如果它们放在应用程序的资源中)

但我在我的应用程序中尝试了这两种方法,只有第二种使用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设置为Right,可以很容易地看到这一点

编辑2:此代码只需放入my App.xaml中的资源字典中即可。将TargetType=“{x:Type ComboBoxItem}”替换为TargetType=“ComboBoxItem”没有任何区别


编辑3:我刚刚意识到我可能忘记了精确定义一些重要的东西(很抱歉):虽然样式是在xaml中定义的,但我实际上是在动态添加控件时,将它们添加到代码后面的布局中。问题可能就在这里…

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

如果没有明确的
定义,您能否将整个代码发布到无法工作的地方

如上面第一个示例所示, 将TargetType属性设置为 文本块而不指定样式 使用x:键可以使您的风格 应用于所有文本块元素。 实际上发生的是这样做 隐式地将x:Key设置为{x:Type TextBlock}。这也意味着如果 将样式的x:Key值指定为 除{x:Type以外的任何内容 TextBlock},则该样式不会为 应用于所有文本块元素 自动地相反,你需要 将样式应用于文本块 元素

考虑到这一点,您的问题必须是异常情况。我已经看到了一些这样的奇怪现象,它们并不完全出乎意料,因为WPF背后的编码注定是不完美的


(如果省略键,
TargetType=“ComboBoxItem”
TargetType=“{x:Type ComboBoxItem}”
之间的结果是否有差异?

现在您可以通过添加一个:

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>

我在左中锋
我是中锋

另外,在非工作示例中,尝试将TargetType=“{x:Type ComboBoxItem}替换为TargetType=“ComboBoxItem“我用你们问题的答案再次编辑了我的问题:我真的对此感到困惑。也许我的应用程序代码的其他部分会弄乱wpf的行为方式,但我不会检查我添加的每个组合框,虽然这会花费太长时间,而且我可以使用x:Key集。。。这真的只是出于好奇…我看到了你的编辑3,我想这是某种程度上的原因。但这并不能解释为什么在明确设置x:Key时它会起作用。可能隐式键是XAML解析器负责的,不适用于以编程方式添加的控件,而显式键定义负责,但这只是我的推测。一个有趣的案例!你能详细说明一下你在这里的意思吗:因为WPF背后的编码注定是不完美的。你认为这个案例是WPF中的一个bug吗?我认为我们需要看更多的代码才能得出结论。“你认为这个案例是WPF中的一个bug吗?”是的,这正是我的意思。我不认为你需要更多的代码来得出这个结论,因为我们有一个应该发生什么的描述和一个报告,事实上并不总是这样。所提供的代码似乎非常简单,如果其他所有内容都保持不变,您可以得出结论,故障必须与核心WPF代码有关。然后,您的ComboBoxItem样式将仅在显式位于XAML中时才适用。我将此标记为正确答案,因为我现在确信必须是这样的。我确实做了一个新的测试项目,只是为了尝试你们写的所有东西,基本上你们都没事:我得到了你们写的我应该得到的东西。现在,我确信这在我的主项目中不起作用,因为它在我的测试项目中起作用。一定有什么地方触发了“错误”行为,但我找不到什么。这与我的样式声明方式无关,因为我在测试应用程序中声明它们的方式与在主应用程序中声明的方式完全相同。我不知道这个语法,很有趣!但是,没有真正说明x:key=“{x:type xxx}”的作用。您的示例在没有x:key的情况下工作,因此在这里没有实际意义