2009-11-06 67 views
4

我可能错过了WPF的一些显而易见的东西,但是有可能创建符合目标控件的子控件分层次工作的样式吗?为了更好地解释,请考虑CSS如何对HTML进行样式设计。您可以通过选择层次目标与CSS控制:WPF样式阶层?

div > span em 
{ 
    color: blue; 
} 

ul.class > li ul li 
{ 
    display: block; 
    margin: 0px; 
} 

是否有可能实现与WPF风格是一回事吗?到目前为止,我一直在为每种类型的控件创建样式,或者直接将其应用于控件的命名样式。然而,我最终的风格比我真正打算的要多得多,我几乎不可能将控制结构组合在一起。

感谢您的任何见解。

UPDATE:

这里是我想什么,能够做一个例子。请注意,只有根ListView控件应用了一个Style。我希望能够针对任何一个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> 
+1

稍迟,但请参阅http://www.codeproject.com/Articles/36499/Using-CSS-Selectors-for-Styling-in-WPF – 2011-10-20 12:42:38

+0

@BorisB。谢谢!棒极了! – jrista 2011-10-22 02:50:07

回答

1

我会作出这样的评论,但跑出来的字符

嗯的。鉴于来自使用隐式样式的andyp的答案不能解决您的问题,我可以想到两种稍微不同的方法来实现这一点。

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

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

不确定那些会得到你想要的,但它是值得一试。

此外,你可以发布一个代码片段,更清楚地显示你正在尝试完成什么。解决这个问题的方法可能会简单得多,我只是缺少了。

0

我不能百分之百肯定,如果我理解正确,不过我想你想要的是风格的基类,并已应用该样式到它的后代了。

所以,如果,例如,你想要的风格组合框,你可以写:

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

而是你也可以这样写:

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

,并已应用的所有后代风格控制而不仅仅是ComboBoxes。该示例(直接和未编辑)取自this博客文章。

+0

你近,但我需要它走得更远一点。它更多地沿着这条线:对于一个特定种类的ListView,其网格作为其项目模板的根控制,使用此样式设置单元格X,Y中的按钮控件。这是否更有意义? – jrista 2009-11-06 21:17:24

+0

是的,我想我现在明白你的意思了,但我不知道如何在WPF中实现这一点。我知道的唯一方法是使用命名样式并将其应用于该按钮(这似乎是您想要避免的)。抱歉。 – andyp 2009-11-06 21:47:44

0

可以实现类似风格的继承,通过使用支持算法FMP attribtue

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

是否帮助CSS是如何做的?

+1

它不是风格的继承。考虑一个层次结构,比如在itemtemplate中使用Grid的listview,并且网格在其单元中包含不同的控件。我如何以分层方式将该控件中的一个控件放置在该列表视图的网格单元格中,而不必直接将该样式直接应用于该控件?使用CSS,我可以使用选择器进行定位:.listview .grid button {...} – jrista 2009-11-09 18:14:03