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