System.Windows.Controls.MenuItem 没有图标区域
Posted
技术标签:
【中文标题】System.Windows.Controls.MenuItem 没有图标区域【英文标题】:System.Windows.Controls.MenuItem without icon area 【发布时间】:2011-07-13 16:57:00 【问题描述】:每当我尝试使用 WPF 菜单项的外观时,我都会浪费机会自定义标题,这基本上是一个项目的文本。
我需要的是有一个黑色菜单,带有白色文本且没有“图标区域”。
||Some text http://img848.imageshack.us/img848/7622/iconarea.png
如何删除菜单项的图标区域?
谢谢。
【问题讨论】:
【参考方案1】:你可以通过定义MenuItem
的ItemsPanel
属性来实现。
创建一个ItemsPanelTemplate
资源
<ItemsPanelTemplate x:Key="MenuItemPanelTemplate">
<StackPanel Margin="-20,0,0,0" Background="White"/>
</ItemsPanelTemplate>
将MenuItem
样式下方添加到资源中,您就完成了。
<Style TargetType="x:Type MenuItem">
<Setter Property="ItemsPanel" Value="StaticResource MenuItemPanelTemplate"/>
</Style>
要将相同的Style
应用于ContextMenu
,您需要再创建一个Style
,如下所示-
<Style TargetType="x:Type ContextMenu">
<Setter Property="ItemsPanel" Value="StaticResource MenuItemPanelTemplate"/>
</Style>
【讨论】:
它适用于普通菜单,但不适用于 ContextMenu。 是的,它有效。但就我而言,我不需要 ContextMenu 的“边距”。只需白色背景就足够了。 @Nitesh 我喜欢您的解决方案,因为它简短而简单。但我不确定ItemsPanelTemplate
会放在哪里。你能解释一下吗?
您可以在您的窗口、应用程序、控件的资源中进行设置。或者,如果您只希望它用于一个(上下文)菜单,您可以直接在菜单中设置它。像这样: 您需要从 here 中获取默认样式,并从 MenuItem 的控件模板中删除该区域。
对于 MenuItem,您实际上可以只重新定义 SubmenuItemTemplateKey 和 SubmenuHeaderTemplateKey ControlTemplate,类似于 here 中描述的内容。
编辑:
背景实际上是由菜单样式渲染的。如果你搜索“MenuItemIconColumnGroup”,你会找到所有使用它的地方。
编辑:
这是一个使用黑色背景和白色前景的完整示例:
<Application x:Class="DeleteMeWPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
StartupUri="MainWindow.xaml">
<Application.Resources>
<MenuScrollingVisibilityConverter x:Key="MenuScrollingVisibilityConverter" />
<Geometry x:Key="DownArrow">M 0,0 L 3.5,4 L 7,0 Z</Geometry>
<Geometry x:Key="UpArrow">M 0,4 L 3.5,0 L 7,4 Z</Geometry>
<Geometry x:Key="RightArrow">M 0,0 L 4,3.5 L 0,7 Z</Geometry>
<Geometry x:Key="Checkmark">M 0,5.1 L 1.7,5.2 L 3.4,7.1 L 8,0.4 L 9.2,0 L 3.3,10.8 Z</Geometry>
<LinearGradientBrush x:Key="MenuItemSelectionFill" StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#34C5EBFF" Offset="0" />
<GradientStop Color="#3481D8FF" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<LinearGradientBrush x:Key="MenuItemPressedFill" StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#28717070" Offset="0" />
<GradientStop Color="#50717070" Offset="0.75" />
<GradientStop Color="#90717070" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<Style x:Key="x:Static MenuItem.SeparatorStyleKey" TargetType="x:Type Separator">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type Separator">
<Grid SnapsToDevicePixels="true" Margin="0,6,0,4">
<Rectangle Height="1" Margin="30,0,1,1" Fill="#E0E0E0" />
<Rectangle Height="1" Margin="30,1,1,0" Fill="White" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="ComponentResourceKey TypeInTargetAssembly=x:Type FrameworkElement, ResourceId=SubmenuContent"
TargetType="x:Type ContentControl">
<Border Background="Black" BorderBrush="#FF959595" BorderThickness="1">
<ContentPresenter Grid.ColumnSpan="2" Margin="1,0" />
</Border>
</ControlTemplate>
<ControlTemplate x:Key="ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=TopLevelItemTemplateKey"
TargetType="x:Type MenuItem">
<Grid SnapsToDevicePixels="true">
<Rectangle x:Name="OuterBorder" RadiusX="2" RadiusY="2" />
<Rectangle Name="Bg" Margin="1" Fill="TemplateBinding MenuItem.Background" Stroke="TemplateBinding MenuItem.BorderBrush"
StrokeThickness="1" RadiusX="1" RadiusY="1" />
<Rectangle x:Name="InnerBorder" Margin="2" />
<DockPanel>
<ContentPresenter x:Name="Icon" Margin="4,0,6,0" VerticalAlignment="Center" ContentSource="Icon"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
<Path x:Name="Glyphpanel" Margin="7,0,0,0" Visibility="Collapsed" VerticalAlignment="Center"
Fill="TemplateBinding MenuItem.Foreground" FlowDirection="LeftToRight" Data="StaticResource Checkmark" />
<ContentPresenter ContentSource="Header" Margin="TemplateBinding MenuItem.Padding" RecognizesAccessKey="True"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
</DockPanel>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Icon" Value="x:Null">
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" />
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Bg" Property="Stroke" Value="#90717070" />
<Setter TargetName="OuterBorder" Property="Stroke" Value="#50FFFFFF" />
<Setter TargetName="InnerBorder" Property="Stroke" Value="#50FFFFFF" />
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Bg" Property="Stroke" Value="#E0717070" />
<Setter TargetName="Bg" Property="Fill" Value="StaticResource MenuItemPressedFill" />
<Setter TargetName="InnerBorder" Property="Stroke" Value="#50747272" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#FF9A9A9A" />
<Setter TargetName="GlyphPanel" Property="Fill" Value="#848589" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=TopLevelHeaderTemplateKey"
TargetType="x:Type MenuItem">
<Grid SnapsToDevicePixels="true">
<Rectangle x:Name="OuterBorder" RadiusX="2" RadiusY="2" />
<Rectangle Name="Bg" Margin="1" Fill="TemplateBinding MenuItem.Background" Stroke="TemplateBinding MenuItem.BorderBrush"
StrokeThickness="1" RadiusX="1" RadiusY="1" />
<Rectangle x:Name="InnerBorder" Margin="2" />
<DockPanel>
<ContentPresenter x:Name="Icon" Margin="4,0,6,0" VerticalAlignment="Center" ContentSource="Icon"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
<Path x:Name="GlyphPanel" Margin="7,0,0,0" Visibility="Collapsed" VerticalAlignment="Center"
Fill="TemplateBinding MenuItem.Foreground" FlowDirection="LeftToRight" Data="StaticResource Checkmark" />
<ContentPresenter ContentSource="Header" Margin="TemplateBinding MenuItem.Padding" RecognizesAccessKey="True"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
</DockPanel>
<Popup x:Name="PART_Popup" HorizontalOffset="1" VerticalOffset="-1" AllowsTransparency="true" Placement="Bottom"
IsOpen="Binding Path=IsSubmenuOpen,RelativeSource=RelativeSource TemplatedParent" Focusable="false"
PopupAnimation="DynamicResource x:Static SystemParameters.MenuPopupAnimationKey">
<theme:SystemDropShadowChrome Name="Shdw" Color="Transparent">
<ContentControl Name="SubMenuBorder"
Template="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type FrameworkElement, ResourceId=SubmenuContent"
IsTabStop="false">
<ScrollViewer CanContentScroll="true"
Style="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type FrameworkElement, ResourceId=MenuScrollViewer">
<ItemsPresenter Margin="2" KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.DirectionalNavigation="Cycle"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" Grid.IsSharedSizeScope="true" />
</ScrollViewer>
</ContentControl>
</theme:SystemDropShadowChrome>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSuspendingPopupAnimation" Value="true">
<Setter TargetName="PART_Popup" Property="PopupAnimation" Value="None" />
</Trigger>
<Trigger Property="Icon" Value="x:Null">
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" />
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger SourceName="PART_Popup" Property="Popup.HasDropShadow" Value="true">
<Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
<Setter TargetName="Shdw" Property="Color" Value="#71000000" />
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Bg" Property="Stroke" Value="#90717070" />
<Setter TargetName="OuterBorder" Property="Stroke" Value="#50FFFFFF" />
<Setter TargetName="InnerBorder" Property="Stroke" Value="#50FFFFFF" />
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Bg" Property="Stroke" Value="#E0717070" />
<Setter TargetName="Bg" Property="Fill" Value="StaticResource MenuItemPressedFill" />
<Setter TargetName="InnerBorder" Property="Stroke" Value="#50747272" />
</Trigger>
<Trigger Property="IsSubmenuOpen" Value="true">
<Setter TargetName="Bg" Property="Stroke" Value="#E0717070" />
<Setter TargetName="Bg" Property="Fill" Value="StaticResource MenuItemPressedFill" />
<Setter TargetName="InnerBorder" Property="Stroke" Value="#50747272" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#FF9A9A9A" />
<Setter TargetName="GlyphPanel" Property="Fill" Value="#848589" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=SubmenuItemTemplateKey"
TargetType="x:Type MenuItem">
<Grid SnapsToDevicePixels="true">
<Rectangle Name="Bg" Fill="TemplateBinding MenuItem.Background" Stroke="TemplateBinding MenuItem.BorderBrush"
StrokeThickness="1" RadiusX="2" RadiusY="2" />
<Rectangle x:Name="InnerBorder" Margin="1" RadiusX="2" RadiusY="2" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIconColumnGroup" />
<ColumnDefinition Width="4" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="37" />
<ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIGTColumnGroup" />
<ColumnDefinition Width="17" />
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="Icon" Margin="1" VerticalAlignment="Center" ContentSource="Icon"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
<Border x:Name="GlyphPanel" Background="#E6EFF4" BorderBrush="#CDD3E6" BorderThickness="1" CornerRadius="3" Margin="1"
Visibility="Collapsed" Width="22" Height="22">
<Path Name="Glyph" Width="9" Height="11" Fill="#0C12A1" FlowDirection="LeftToRight"
Data="StaticResource Checkmark" />
</Border>
<ContentPresenter Grid.Column="2" ContentSource="Header" Margin="TemplateBinding MenuItem.Padding"
RecognizesAccessKey="True" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
<TextBlock Grid.Column="4" Text="TemplateBinding MenuItem.InputGestureText"
Margin="TemplateBinding MenuItem.Padding" />
</Grid>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Icon" Value="x:Null">
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" />
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Bg" Property="Fill" Value="StaticResource MenuItemSelectionFill" />
<Setter TargetName="Bg" Property="Stroke" Value="#8071CBF1" />
<Setter TargetName="InnerBorder" Property="Stroke" Value="#40FFFFFF" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#FF9A9A9A" />
<Setter TargetName="GlyphPanel" Property="Background" Value="#EEE9E9" />
<Setter TargetName="GlyphPanel" Property="BorderBrush" Value="#DBD6D6" />
<Setter TargetName="Glyph" Property="Fill" Value="#848589" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=SubmenuHeaderTemplateKey"
TargetType="x:Type MenuItem">
<Grid SnapsToDevicePixels="true">
<Rectangle Name="Bg" Fill="TemplateBinding MenuItem.Background" Stroke="TemplateBinding MenuItem.BorderBrush"
StrokeThickness="1" RadiusX="2" RadiusY="2" />
<Rectangle x:Name="InnerBorder" Margin="1" Stroke="Transparent" StrokeThickness="1" RadiusX="2" RadiusY="2" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIconColumnGroup" />
<ColumnDefinition Width="4" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="37" />
<ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIGTColumnGroup" />
<ColumnDefinition Width="17" />
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="Icon" Margin="1" VerticalAlignment="Center" ContentSource="Icon"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
<Border x:Name="GlyphPanel" Background="#E6EFF4" BorderBrush="#CDD3E6" BorderThickness="1" CornerRadius="3" Margin="1"
Visibility="Collapsed" Width="22" Height="22">
<Path Name="Glyph" Width="9" Height="11" Fill="#0C12A1" FlowDirection="LeftToRight"
Data="StaticResource Checkmark" />
</Border>
<ContentPresenter Grid.Column="2" ContentSource="Header" Margin="TemplateBinding MenuItem.Padding"
RecognizesAccessKey="True" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
<TextBlock Grid.Column="4" Text="TemplateBinding MenuItem.InputGestureText"
Margin="TemplateBinding MenuItem.Padding" Visibility="Collapsed" />
<Path Grid.Column="5" VerticalAlignment="Center" Margin="4,0,0,0" Fill="TemplateBinding MenuItem.Foreground"
Data="StaticResource RightArrow" />
</Grid>
<Popup x:Name="PART_Popup" AllowsTransparency="true" Placement="Right" VerticalOffset="-3" HorizontalOffset="-2"
IsOpen="Binding Path=IsSubmenuOpen,RelativeSource=RelativeSource TemplatedParent" Focusable="false"
PopupAnimation="DynamicResource x:Static SystemParameters.MenuPopupAnimationKey">
<theme:SystemDropShadowChrome Name="Shdw" Color="Transparent">
<ContentControl Name="SubMenuBorder"
Template="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type FrameworkElement, ResourceId=SubmenuContent"
IsTabStop="false">
<ScrollViewer CanContentScroll="true"
Style="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type FrameworkElement, ResourceId=MenuScrollViewer">
<ItemsPresenter Margin="2" KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.DirectionalNavigation="Cycle"
SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" Grid.IsSharedSizeScope="true" />
</ScrollViewer>
</ContentControl>
</theme:SystemDropShadowChrome>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSuspendingPopupAnimation" Value="true">
<Setter TargetName="PART_Popup" Property="PopupAnimation" Value="None" />
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="InnerBorder" Property="Stroke" Value="#D1DBF4FF" />
</Trigger>
<Trigger Property="Icon" Value="x:Null">
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" />
<Setter TargetName="Icon" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger SourceName="PART_Popup" Property="Popup.HasDropShadow" Value="true">
<Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
<Setter TargetName="Shdw" Property="Color" Value="#71000000" />
</Trigger>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="Bg" Property="Fill" Value="StaticResource MenuItemSelectionFill" />
<Setter TargetName="Bg" Property="Stroke" Value="#8571CBF1" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#FF9A9A9A" />
<Setter TargetName="GlyphPanel" Property="Background" Value="#EEE9E9" />
<Setter TargetName="GlyphPanel" Property="BorderBrush" Value="#DBD6D6" />
<Setter TargetName="Glyph" Property="Fill" Value="#848589" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style TargetType="x:Type MenuItem">
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="HorizontalContentAlignment"
Value="Binding Path=HorizontalContentAlignment,RelativeSource=RelativeSource AncestorType=x:Type ItemsControl" />
<Setter Property="VerticalContentAlignment"
Value="Binding Path=VerticalContentAlignment,RelativeSource=RelativeSource AncestorType=x:Type ItemsControl" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template"
Value="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=SubmenuItemTemplateKey" />
<Style.Triggers>
<Trigger Property="Role" Value="TopLevelHeader">
<Setter Property="Padding" Value="7,2,8,3" />
<Setter Property="Template"
Value="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=TopLevelHeaderTemplateKey" />
</Trigger>
<Trigger Property="Role" Value="TopLevelItem">
<Setter Property="Padding" Value="7,2,8,3" />
<Setter Property="Template"
Value="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=TopLevelItemTemplateKey" />
</Trigger>
<Trigger Property="Role" Value="SubmenuHeader">
<Setter Property="Padding" Value="2,3,2,3" />
<Setter Property="Template"
Value="DynamicResource ComponentResourceKey TypeInTargetAssembly=x:Type MenuItem, ResourceId=SubmenuHeaderTemplateKey" />
</Trigger>
<Trigger Property="Role" Value="SubmenuItem">
<Setter Property="Padding" Value="2,3,2,3" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="x:Type Menu">
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="Background" Value="Black" />
<Setter Property="FontFamily" Value="DynamicResource x:Static SystemFonts.MenuFontFamilyKey" />
<Setter Property="FontSize" Value="DynamicResource x:Static SystemFonts.MenuFontSizeKey" />
<Setter Property="FontStyle" Value="DynamicResource x:Static SystemFonts.MenuFontStyleKey" />
<Setter Property="FontWeight" Value="DynamicResource x:Static SystemFonts.MenuFontWeightKey" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type Menu">
<Border Background="TemplateBinding Background" BorderBrush="TemplateBinding BorderBrush"
BorderThickness="TemplateBinding BorderThickness" Padding="TemplateBinding Padding"
SnapsToDevicePixels="true">
<ItemsPresenter SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
</Application>
【讨论】:
不幸的是,我一直试图找到负责“图标”背景的部分,但仍然无法做到。我得到的最好的东西是标题文本左对齐(这是正确的),但曾经是图标列的背景仍然存在。明天会尝试更多。每当我完成后,我将发布一个带有“已消除”图标背景区域的最终模板。 我已经下载了带有所有控件样式的 AeroTheme xaml。复制整个 MenuItem 定位样式并开始注释声明。但说实话,花了一个多小时取出元素后,背景还是和我预想的不太一样。这是一个可靠但非常复杂的方法。我会在一些开源项目中寻找我需要的菜单项声明。 您实际上还需要复制菜单样式,而不仅仅是菜单项。今天晚些时候我会试着把一些东西放在一起。 Menu 样式(而不是 MenuItem 样式)的背景非常令人沮丧。在我的情况下,它是 ContextMenu 而不是菜单......但无论如何,谢谢你的回答!【参考方案3】:覆盖Template
的解决方案似乎是矫枉过正(对我来说),'nits' 的另一个答案很酷,但选择覆盖没有正确绘制(在我的示例中)。
我的目标是利用图标的空间和快捷方式的空间。
结果如下:
代码如下:
<ContextMenu ItemsSource="Binding MyItems" >
<ContextMenu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Background="White"></StackPanel>
</ItemsPanelTemplate>
</ContextMenu.ItemsPanel>
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="Binding Path=DataContext.XyzCommand, RelativeSource=RelativeSource AncestorType=x:Type UserControl"/>
<Setter Property="CommandParameter" Value="Binding"/>
</Style>
</ContextMenu.ItemContainerStyle>
<ContextMenu.ItemTemplate>
<DataTemplate>
<Grid Margin="-20,0,-40,0"><!--this part is important-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="Binding Ident"/>
<TextBlock Grid.Column="1" Text="Binding Description"/>
</Grid>
</DataTemplate>
</ContextMenu.ItemTemplate>
-20 使用图标的空间,-40 使用快捷方式的空间。此外,在此示例中会自动计算弹出窗口的大小。
另外值得一提的是命令的绑定:所有项目都绑定到同一个命令,但项目本身作为事件的参数给出(CommandParameter
)。
public ViewModel()
XyzCommand = new DelegateCommand<Item>(XyzCommandExecute);
private void XyzCommandExecute(Item item)
//command code
【讨论】:
以上是关于System.Windows.Controls.MenuItem 没有图标区域的主要内容,如果未能解决你的问题,请参考以下文章