WPF中MenuItem内嵌StackPanel出现多余空白及白色边框如何解决?
问题原因
- 多余空白:一是你在父MenuItem内额外嵌套了不必要的
StackPanel,叠加了控件默认边距;二是WPF默认MenuItem的子菜单自带图标预留区、快捷键预留区的空白,你没有用到这两个区域就会显示为多余空白。 - 白色边框:你只配置了MenuItem的基础前景背景属性,没有覆盖控件默认的边框属性,也没处理子菜单弹出层(Popup)自带的默认白色边框。
解决步骤
1. 修正子菜单的错误写法
直接移除父MenuItem内多余的StackPanel,MenuItem本身自带子项容器,不需要额外嵌套布局控件。
2. 补充完整样式配置
你需要额外覆盖Menu控件的边框属性、MenuItem的边框属性,以及子菜单弹出层的边距和边框,同时关闭默认的图标预留区空白。
调整后的完整样式代码
<!-- 清除Menu控件本身的默认边框和空白 --> <Style TargetType="Menu"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="Padding" Value="0"/> <Setter Property="Background" Value="#FF1E1E1E"/> </Style> <Style TargetType="MenuItem"> <Setter Property="Foreground" Value="white"/> <Setter Property="FontWeight" Value="Medium"/> <Setter Property="Background" Value="#FF1E1E1E"/> <Setter Property="Padding" Value="6 2"/> <Setter Property="BorderThickness" Value="0"/> <Setter Property="BorderBrush" Value="Transparent"/> <!-- 清除子菜单列表的默认边距 --> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <StackPanel Margin="0"/> </ItemsPanelTemplate> </Setter.Value> </Setter> <!-- 重写控件模板,移除默认图标预留区、白色边框 --> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="MenuItem"> <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> <ContentPresenter ContentSource="Header" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="Border" Property="Foreground" Value="#FFBDF9F9"/> <Setter Property="Cursor" Value="Hand"/> </Trigger> <Trigger Property="IsSubmenuOpen" Value="True"> <Setter TargetName="Border" Property="Background" Value="#FF1E1E1E"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <!-- 清除子菜单弹出层的默认白边框 --> <Setter Property="SubmenuBorderBrush" Value="Transparent"/> <Setter Property="SubmenuBorderThickness" Value="0"/> </Style>
调整后的Menu控件代码
<Menu VerticalAlignment="Top" Height="25" Grid.RowSpan="2" Width="780"> <MenuItem x:Name="menuFile" Header="File"> <MenuItem x:Name="menu_Exit" Header="Exit" Click="menu_Exit_Click"/> </MenuItem> <MenuItem x:Name="menuPriceListOptions" Header="Price List Options" > <MenuItem x:Name="menu_VewPrices" Header="Vew Prices" Click="menu_VewPrices_Click" /> <MenuItem x:Name ="menu_ImportPricesFromFile" Header="Import Prices From File" Click="menu_ImportPricesFromFile_Click" /> <MenuItem Header="Import Prices Manualy" /> </MenuItem> </Menu>
内容的提问来源于stack exchange,提问作者Radi Hadzhiev
相关产品推荐
相关产品推荐

