WPF:为什么嵌套样式并不总是起作用?

3
我正在尝试将嵌套的WPF样式应用于工具栏,希望所有工具栏子元素(比如菜单项、按钮、切换按钮等)都能使用指定的样式。
问题是,嵌套样式定义会正确地应用于一些控件(例如菜单项),但不适用于按钮。我做错了什么?
菜单项被正确地放置在工具栏底部,但是切换按钮位于中间位置: 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个回答

3
WPF的ToolBar是一种特殊类型的控件,为一些WPF控件(如ButtonToggleButton等)定义了一些自定义样式...完整列表在这里, 您可以通过ElementName + StyleKey属性名称来识别它们。如果您想要更改特定控件的默认样式,您将需要修改其中一个这些样式。
尝试使用以下内容替换ToggleButton的样式:
<Style x:Key="{x:Static ToolBar.ToggleButtonStyleKey}" TargetType="ToggleButton">
    <Setter Property="VerticalAlignment" Value="Bottom" />
</Style>

0
你做错的事情是 认为 WPF 的 Style 就像 CSS 样式一样。在 WPF 中,Style 并不是那样使用的。当然,如果可以的话,我们可能会节省几行 XAML,但我们不能这样做。我们能做的最好的事情就是你所做的... 我假设你已经为像 Control 这样的顶级元素创建了一个 Style。正如你所看到的,不是所有的控件都会扩展 Control 类,因此 Style 不会应用于所有控件。

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


更新 >>>

针对您的第一条评论,您似乎有所误解。为了澄清,如果您所谓的“嵌套Style”是您在外部Style.Resources部分中定义的Style,那么这没有任何问题...完全没有问题。只需将这些内部Style移出Resources部分,您就会看到相同的UI。

现在您可能正在考虑更改问题标题,例如“为什么我的默认ToggleButton StyleToolBar控件内部没有应用?”尽管我不能确定,但我只能假设这种行为是由于在ToolBar ControlTemplate中定义了一个Style所致。

我之所以这样想,是因为以下几点:

  • 自定义的隐式Style(没有x:Key)将无法在ToolBar控件内工作。
  • 自定义的显式Style(命名)按预期在ToolBar控件内工作。
  • 在元素上设置Style属性按预期在ToolBar控件内工作。

抱歉,我不理解你的答案:MenuItem是Control,ToggelButton也是Control。嵌套样式可能有其优缺点,但为什么在我的示例中它不起作用呢? - Knasterbax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接