在我看来,我在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”的子菜单样式,它也有前景,所以它与父菜单中的相同属性有某种冲突(虽然子菜单的前景色设置成功)。
那么在这种情况下,如何设置父菜单自己的样式呢?这是我在 SOF 中的第一个问题,我希望我已经清楚地描述了这个问题,非常感谢你们提前的帮助!
我已尝试将
x:Shared = False
应用于 MenuItemStyle1 和 MenuItemStyle2,但它不起作用(问题仍然相同)
现在问题已经清楚了。因此,在我的应用程序上下文中,“MenuItem”正在应用 ResouceDictionary 文件中的自定义样式。
在该自定义样式中,“Template”属性设置为“ControlTemplate”值。在其 ControlTemplate.Triggers 中,它定义了 Foreground 和其他属性(例如最右侧子箭头的可见性),具体取决于 MenuItem 是否有 Child。
在WPF中,对于UI元素(如Foreground)的相同属性,Template中定义的值优先于Style中直接定义的值。
回到我的例子,“Menu1”和“Menu2”的前景都是由显式样式(MenuItemStyle1)定义的。 “Menu2”的前景由 MenuItemStyle1 设置,但“Menu1”的前景仍然根据模板的 ControlTemplate.Triggers(黑色)设置,而不是其显式样式(浅绿色)。