WPF:为什么嵌套样式并不总是有效?

时间:2013-11-26 14:20:07

标签: wpf styles nested toolbar togglebutton

我正在尝试将嵌套的WPF样式应用于工具栏。我想让工具栏的所有子项(MenuItems,Buttons,ToggleButtons等)具有指定的样式。

问题是,嵌套样式定义是否正确应用于某些控件(如MenuItems),而不是按钮。 我做错了什么?

MenuItem正确放置在工具栏的底部,但ToggleButton位于中间位置:

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>

2 个答案:

答案 0 :(得分:3)

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

尝试使用以下内容替换ToggleButton的样式:

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

答案 1 :(得分:0)

你错误的是认为WPF Style就像CSS个样式。在WPF中,Style只是没有这样使用。当然,如果可以,我们可能会保存几行XAML,但我们不能。我们能做的最好的就是你所做的......我假设你为Style这样的顶级元素创建了Control。如您所见,并非所有控件都会扩展Control类,因此Style不会应用于所有控件。

相反,WPF中的Style更像是CSS中的.class样式...每种类型一个Style,然后我们可以为每个UI应用更多Style元件。在WPF中有很多这样的情况,我们希望我们可以编写更少的代码,但事实就是这样,每个人越早意识到它就越好。


更新&gt;&gt;&gt;

在回复您的第一条评论时,您似乎错了。只是为了澄清一下,如果您正在调用嵌套的Style s 是您在外部Style部分中定义的Style.Resources,那么没有任何问题那......没有问题。只需从Style部分中取出内部Resources,您就会看到相同的用户界面。

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

我想是因为以下几点:

  • 自定义隐式Style(无x:键)在ToolBar控件内不起作用。
  • 自定义显式Style(已命名)ToolBar控件内按预期工作。
  • 元素上设置的Style属性将ToolBar控件内按预期工作。