【问题标题】:WPF: Why are nested styles not always working?WPF:为什么嵌套样式并不总是有效?
【发布时间】:2013-12-11 17:52:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: wpf styles nested toolbar togglebutton


    【解决方案1】:

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

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


    更新>>>

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

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

    我认为是因为以下几点:

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

    【讨论】:

    • 抱歉,我不明白您的回答:MenuItem 是一个控件,而 ToggelButton 也是一个控件。嵌套样式可能有优点和缺点,但为什么它在我的示例中不起作用。
    【解决方案2】:

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

    尝试将 ToggleButton 的样式替换为以下内容:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多