当 MenuItem 的 ItemContainerStyle 具有相同属性时,WPF Style 的属性无法应用于 MenuItem

问题描述 投票:0回答:1

在我看来,我在ContextMenu下定义了2个MenuItem。

“菜单 1”和“菜单 2”都设置为相同的样式,定义背景和前景色。

唯一的区别是“Menu 2”是单个菜单,但“Menu 1”还有子菜单和子菜单样式(在“ItemContainerStyle”中)。

查看.xaml:

            <contextMenuButton:ContextMenuButton Grid.Column="0" 
                                                 VerticalAlignment="Top" 
                                                 HorizontalAlignment="Right"
                                                 Background ="Transparent" 
                                                 Margin="0, 0, 150, 0"
                                                 BorderThickness="0" 
                                                 Foreground ="Chocolate" 
                                                 FontSize="13">
                <contextMenuButton:ContextMenuButton.Content>
                    <TextBlock Text="Menu Button" />
                </contextMenuButton:ContextMenuButton.Content>
                <contextMenuButton:ContextMenuButton.Menu >
                    <ContextMenu Style="{StaticResource ContextMenuStyle1}">
                        <MenuItem Header="Menu 1"
                                  Style="{StaticResource MenuItemStyle1}"
                                  ItemContainerStyle="{StaticResource MenuItemStyle2}"
                                  ItemsSource="{StaticResource SubMenuItems1}"/>
                        <MenuItem Header="Menu 2"
                                  Style="{StaticResource MenuItemStyle1}"/>
                    </ContextMenu>
                </contextMenuButton:ContextMenuButton.Menu>
            </contextMenuButton:ContextMenuButton>

ResourceDictionary.xaml:

    <Style TargetType="ContextMenu"
           x:Key="ContextMenuStyle1">
        <Setter Property="Placement"
                Value="Bottom" />
    </Style>
    <Style x:Key="MenuItemStyle1" TargetType="MenuItem">
        <Setter Property="Foreground"
                Value="LightGreen"/>
        <Setter Property="Background"
                Value="Red"/>
    </Style>
    <Style x:Key="MenuItemStyle2" TargetType="MenuItem">
        <Setter Property="Foreground"
                Value="Blue"/>
    </Style>
    <collections:ArrayList x:Key="SubMenuItems1" >
        <MenuItem Header="First"/>
        <MenuItem Header="Second"/>
        <MenuItem Header="Third"/>
    </collections:ArrayList>

结果显示“菜单2”的背景色和前景色已按预期设置,但“菜单1”的前景色无法设置。我怀疑原因是“菜单1”的子菜单样式,它也有前景,所以它与父菜单中的相同属性有某种冲突(虽然子菜单的前景色设置成功)。

enter image description here

那么在这种情况下,如何设置父菜单自己的样式呢?这是我在 SOF 中的第一个问题,我希望我已经清楚地描述了这个问题,非常感谢你们提前的帮助!

我已尝试将

x:Shared = False
应用于 MenuItemStyle1 和 MenuItemStyle2,但它不起作用(问题仍然相同)

wpf xaml itemcontainerstyle
1个回答
0
投票

现在问题已经清楚了。因此,在我的应用程序上下文中,“MenuItem”正在应用 ResouceDictionary 文件中的自定义样式。

在该自定义样式中,“Template”属性设置为“ControlTemplate”值。在其 ControlTemplate.Triggers 中,它定义了 Foreground 和其他属性(例如最右侧子箭头的可见性),具体取决于 MenuItem 是否有 Child。

在WPF中,对于UI元素(如Foreground)的相同属性,Template中定义的值优先于Style中直接定义的值。

回到我的例子,“Menu1”和“Menu2”的前景都是由显式样式(MenuItemStyle1)定义的。 “Menu2”的前景由 MenuItemStyle1 设置,但“Menu1”的前景仍然根据模板的 ControlTemplate.Triggers(黑色)设置,而不是其显式样式(浅绿色)。

© www.soinside.com 2019 - 2024. All rights reserved.