2013-11-26 55 views
3

我试图将嵌套的WPF样式应用于工具栏。我想让工具栏的所有孩子(MenuItems,Buttons,ToggleButtons等)具有指定的样式。WPF:为什么嵌套样式不总是工作?

问题是,嵌套的样式定义正确地应用于某些控件,如MenuItems,但不适用于按钮。 我在做什么错?

的菜单项正确地放置在工具栏的底部,但切换按钮在中间:

This is what it looks like

<Window.Resources> 
    <Style x:Key="MyToolbarStyle" TargetType="ToolBar"> 
     <!-- Setters for Toolbar properties --> 
     <Setter Property="Height" Value="80" /> 

     <!-- Nested setters for children of the Toolbar --> 
     <Style.Resources> 
      <Style TargetType="MenuItem"> 
       <Setter Property="VerticalAlignment" Value="Bottom" /> 
      </Style> 

      <Style TargetType="ToggleButton"> 
       <Setter Property="VerticalAlignment" Value="Bottom" /> 
      </Style> 
     </Style.Resources> 

    </Style> 
</Window.Resources> 


<Grid > 
    <ToolBar VerticalAlignment="Top" Style="{StaticResource MyToolbarStyle}"> 
     <MenuItem Header="MyMenuItem" />   <!-- Appears on the bottom like defined in the style--> 
     <ToggleButton Content="MyToggleButton" /> <!-- Nested style does not seem to be applied--> 
    </ToolBar> 
</Grid> 

回答

3

的WPF ToolBar是定义了一些自定义样式对于一些WPF控件一样ButtonToggleButton ...完整列表here,您可以通过ElementName + StyleKey属性名识别它们一种特殊类型的控制。如果您想要更改特定控件的默认样式,则必须修改其中一种样式。

尝试更换你的风格的ToggleButton有以下几点:

<Style x:Key="{x:Static ToolBar.ToggleButtonStyleKey}" TargetType="ToggleButton"> 
    <Setter Property="VerticalAlignment" Value="Bottom" /> 
</Style> 
+0

很酷,它的作品!谢谢! – Knasterbax

0

你所做错了,是思考WPF Style s就像CSS款式。在WPF中,Style只是没有这样使用。当然,如果可以的话,我们可能会保存几行XAML,但我们不能。我们可以做的最好的是你所做的......我假设你已经为Control等顶级元素创建了Style。正如你所看到的,并非所有的控件都会扩展Control类,所以Style将不会被应用到所有的控件。

相反,Style S IN WPF都更喜欢.class样式CSS ...一个Style每个类型,然后我们就可以应用每个UI元素进一步Style。在WPF中有很多类似这样的情况,我们希望我们可以编写更少的代码,但实际情况如何,每个人都越早意识到越好。


UPDATE >>>

在回答你的第一个评论,你似乎是错误的。只是为了澄清,如果你打电话嵌套Style sStyle s,你在外部Style.Resources部分定义,那么没有什么错误...没有问题,什么都不是。只需从Resources部分中取出内部Style即可,您将看到相同的用户界面。

现在,您可能正在考虑将问题标题更改为“为什么我的默认ToggleButton Style不适用于ToolBar控件?”。虽然我不能肯定地说,但我只能假设这种行为是由ToolBar ControlTemplate中定义的Style造成的。

我在想,是因为以下几点:

  • 自定义隐含Style(无X:键)不会在ToolBar控制内工作。
  • 自定义显式Style(命名)按预期在ToolBar控件内工作。
  • A Style设置元素的属性将按预期在ToolBar控件内部工作。
+0

很抱歉,但我不明白你的答案:菜单项是控制和ToggelButton是控制为好。嵌套样式可能有优点和缺点,但为什么在我的示例中不起作用。 – Knasterbax