WPF样式层次结构?

时间:2009-11-06 18:29:12

标签: wpf styles

我可能已经错过了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>

3 个答案:

答案 0 :(得分:1)

我本来是一个评论但是用完了字符

嗯。鉴于使用隐式样式的andyp的答案并没有解决你的问题,我可以想到两种稍微不同的方法来做到这一点。

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

我能想到的另一个解决方案是创建一个针对所有网格单元控件继承的根UIElement的样式。在样式中添加一个触发器,根据某个值(Name,Tag,一些其他数据绑定)交换控件的某些属性。

不确定其中任何一个都会得到你想要的东西,但值得一试。

另外,您是否可以发布一个代码片段,更清楚地显示您要完成的内容。可能有一种更简单的方法可以解决我刚刚遗漏的问题。

答案 1 :(得分:0)

如果我理解正确的话,我不是百分百肯定,但我认为你想要的是设计一个基类并将这种风格应用于它的后代。

因此,例如,如果你想为ComboBox设置样式,你可以写:

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

但你也可以写:

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

并将该样式应用于Control的所有后代而不仅仅是ComboBoxes。该示例(直接和未经编辑)取自this博客文章。

答案 2 :(得分:0)

使用BasedOn attribtue

可以实现类似于CSS的Style继承
<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> 

这有帮助吗?