如何正确alignmentWPF中的“帮助”菜单项?

我在我的XAML文件中有以下(简化)部分:

<Menu Width="Auto" Height="20" Background="#FFA9D1F4" DockPanel.Dock="Top"> <MenuItem Header="File"> <MenuItem Header="Exit"/> </MenuItem> <MenuItem Header="Edit"> <MenuItem Header="Cut"/> </MenuItem> <MenuItem Header="Help"> <MenuItem Header="About"/> </MenuItem> </Menu> 

结果是:

 +-------------------------------------------+ | File Edit Help | +-------------------------------------------+ | | 

如果我想要右侧的Help菜单项,我需要做什么:

 +-------------------------------------------+ | File Edit Help | +-------------------------------------------+ | | 

阿尔同样的原则,这次你不需要网格,因此不需要知道项目的数量。 除了帮助之外,将所有项目分配到左侧

 <Menu Height="20" Background="#FFA9D1F4"> <Menu.ItemsPanel> <ItemsPanelTemplate> <DockPanel HorizontalAlignment="Stretch"/> </ItemsPanelTemplate> </Menu.ItemsPanel> <MenuItem Header="File"> <MenuItem Header="Exit"/> </MenuItem> <MenuItem Header="Edit"> <MenuItem Header="Cut"/> </MenuItem> <MenuItem Header="Help" HorizontalAlignment="Right"> <MenuItem Header="About"/> </MenuItem> </Menu> 

另一个可能的答案,如果你总是知道会有多less菜单项(这使得这个答案很脆弱),那就是将Menu.ItemsPanel定义为一个网格,将Menu设置为Stretch,适当地设置Grid.ColumnDefinitions,设置MenuItems添加到相应的Grid.Column,并将最后一个菜单项的Horizo​​ntalAlignment设置为Right。

  <Menu Height="20" Background="#FFA9D1F4" DockPanel.Dock="Top" HorizontalAlignment="Stretch"> <Menu.ItemsPanel> <ItemsPanelTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> </Grid> </ItemsPanelTemplate> </Menu.ItemsPanel> <MenuItem Header="File" Grid.Column="0"> <MenuItem Header="Exit"/> </MenuItem> <MenuItem Header="Edit" Grid.Column="1"> <MenuItem Header="Cut"/> </MenuItem> <MenuItem Header="Help" Grid.Column="2" HorizontalAlignment="Right"> <MenuItem Header="About"/> </MenuItem> </Menu> 

原来的答案的变化,因为它(水平alignment=“拉伸”)编辑菜单将拉伸整个菜单栏到帮助菜单。

还包含Rokke的子菜单alignmentbuild议…

 <Menu Height="20" Background="#FFA9D1F4"> <Menu.ItemsPanel> <ItemsPanelTemplate> <DockPanel/> </ItemsPanelTemplate> </Menu.ItemsPanel> <MenuItem Header="File"> <MenuItem Header="Exit"/> </MenuItem> <MenuItem Header="Edit"> <MenuItem Header="Cut"/> </MenuItem> <MenuItem Header="_Help" HorizontalAlignment="Right" FlowDirection="RightToLeft"> <MenuItem Header="About..." FlowDirection="LeftToRight"/> </MenuItem> </Menu> 

我不认为有一个简单的方法。 菜单保留所有项目,甚至忽略MenuItem的Horizo​​ntalContentAlignment或MenuItem的Horizo​​ntalAlignment。

但是你可以做一个解决方法。 保证金属性起作用。 所以我认为你可以绑定帮助MenuItem的边缘菜单的宽度。 但是你将不得不使用一个转换器来计算宽度的边距。

我不知道是否该做这样的事情。 我不会。 但是,如果你真的想要它,这是一个应该工作的方式。

 <Menu DockPanel.Dock="Top"> <Menu.ItemsPanel> <ItemsPanelTemplate> <DockPanel HorizontalAlignment="Stretch"/> </ItemsPanelTemplate> </Menu.ItemsPanel> <MenuItem Header="_File"> <MenuItem Click="Exit_Clicked" Header="E_xit" /> </MenuItem> <MenuItem Header="_User"> <MenuItem Click="ChangePassword_Clicked" Header="_Change Password..." /> </MenuItem> <!-- Right adjusted help menu with sub menu keeping inside the main window --> <MenuItem Header="_Help" HorizontalAlignment="Right" FlowDirection="RightToLeft"> <MenuItem Click="About_Clicked" Header="_About..." FlowDirection="LeftToRight" /> </MenuItem> </Menu> 

只是原来的答案的一小部分。 包括两个stream动方向使子菜单留在窗口内。

使用DockPanel或者Grid,有一个,也许有两个潜在的缺点,而不是默认的WrapPanel。

  1. 如果窗口太小而无法在一行显示所有的菜单项,则它们将不会换行到下一个菜单项。
  2. 如果菜单项将被共享在不同的上下文中使用,例如在ContextMenu中,则最后一项将被右alignment