WPF风格的层次结构?

WPF风格的层次结构?,wpf,styles,Wpf,Styles,我可能错过了WPF中一些明显的东西,但有可能创建与目标控件的子控件分层工作的样式吗?为了更好地解释,请考虑CSS是如何为HTML设计样式的。您可以通过选择器使用CSS按层次将控件作为目标: div > span em { color: blue; } ul.class > li ul li { display: block; margin: 0px; } 使用WPF样式可以实现同样的效果吗?到目前为止,我一直在为每种类型的控件创建样式,或者直接应用于控件的命

我可能错过了WPF中一些明显的东西,但有可能创建与目标控件的子控件分层工作的样式吗?为了更好地解释,请考虑CSS是如何为HTML设计样式的。您可以通过选择器使用CSS按层次将控件作为目标:

div > span em
{
   color: blue;
}

ul.class > li ul li
{
    display: block;
    margin: 0px;
}
使用WPF样式可以实现同样的效果吗?到目前为止,我一直在为每种类型的控件创建样式,或者直接应用于控件的命名样式。然而,我最终得到了比我真正想要的多得多的风格,而且我几乎不可能将控制结构作为一个整体来设计

谢谢你的洞察力

更新:

以下是我希望能够做到的一个例子。请注意,只有根ListView控件应用了样式。我希望能够以任何一个CellTemplates中的任何一个子控件为目标,而不必直接将样式应用于每个子控件。这使我的视图布局标记与样式标记更加解耦和隔离,使我可以更自由地更改样式,而不必为整个应用程序中的每个控件显式创建样式

<Grid>
  <ListView Style="{StaticResource ProcessableItemsListView}">
    <ListView.View>
      <GridView>
        <GridViewColumn Width="10">
          <GridViewColumn.CellTemplate>
            <Grid>
              <CheckBox Value="{Binging ...}" />
            </Grid>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Width="*">
          <GridViewColumn.CellTemplate>
            <Grid>
              <TextBlock Text="{Binding ...}" />
            </Grid>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Width="80">
          <GridViewColumn.CellTemplate>
            <Grid>
              <Button Command="{Binding ...}">Process</Button>
            </Grid>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Width="120">
          <GridViewColumn.CellTemplate>
            <Grid>
              <ProgressBar Value="{Binding ...}" />
            </Grid>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
      </GridView>
    </ListView.View>
  </ListBiew>
</Grid>

过程

我不能百分之百确定我是否正确理解您,但我认为您想要的是设计基类的样式,并将该样式应用于它的后代

因此,例如,如果您想要设置组合框的样式,您可以编写:

<Style x:Key="ComboBoxStyle" TargetType="ComboBox">
    ...
</Style>

...
但你也可以写:

<Style x:Key="ComboBoxStyle" TargetType="Control">
    ...
</Style>

...

并将该样式应用于控件的所有子体,而不仅仅是组合框。该示例(直接且未经编辑)摘自博客文章。

您可以实现样式继承,类似于CSS使用BasedOn属性实现样式继承的方式

<Style x:Key="A">
    <Setter Property="Background" Value="Blue" />
</Style> 

<Style x:Key="B" BasedOn="{StaticResource A}">
    <Setter Property="Foreground" Value="Red" />
</Style> 

<Style x:Key="C" BasedOn="{StaticResource A}">
    <Setter Property="Foreground" Value="White" />
</Style> 

这有帮助吗?

我本想对此发表评论的,但已经没有字符了

嗯,鉴于andyp关于使用隐式风格的回答不能解决你的问题,我可以想出两种稍微不同的方法来解决这个问题

一种是使网格单元中的所有控件都是简单的内容控件,并将数据对象绑定到控件的内容属性。然后可以创建针对数据对象的隐式样式,而不是UI控件类型。这与andyp建议的几乎相同,但只是从数据的角度来看(这在您的场景中可能不起作用)

我可以想到的另一个解决方案是创建一个针对某个根元素的样式,所有网格单元控件都从该元素继承。在样式中,添加一个触发器,以根据某个值(名称、标记和其他一些数据绑定)交换控件的某些属性

我不确定这两个都能得到你想要的,但值得一试


另外,您是否可以发布一个代码片段,更清楚地显示您要完成的任务。也许有一个更简单的方法来解决这个问题,我只是错过了。

你的结束,但我需要它走远一点。它更像是这样:对于一种特殊的ListView,网格作为其items模板的根控件,使用此样式设置单元格X,Y中的button控件的样式。这更有意义吗?是的,我想我现在明白你的意思了,但我不知道如何在WPF中实现这一点。我知道的唯一方法是使用命名样式并将其应用于该按钮(这似乎是您想要避免的)。对不起,这不是真正的风格继承。设想一个层次结构,比如在itemtemplate中有一个网格的listview,网格的单元格中包含不同的控件。如何在不必显式地将样式直接应用于控件的情况下,以该listview的网格单元中的一个控件为层次目标?使用CSS,我可以使用选择器来定位:.listview.grid按钮{…}稍微晚一点,但请参见@BorisB。谢谢太棒了!