如何右对齐';帮助';WPF中的菜单项?

如何右对齐';帮助';WPF中的菜单项?,wpf,xaml,visual-studio-2008,Wpf,Xaml,Visual Studio 2008,我的XAML文件中有以下(简化)部分: <Menu Width="Auto" Height="20" Background="#FFA9D1F4" DockPanel.Dock="Top"> <MenuItem Header="File"> <MenuItem Header="Exit"/> </MenuItem> <MenuItem Header="Edit"> <Menu

我的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>
如果需要右侧的
Help
菜单项,我需要做什么:

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

我认为没有一个简单的方法。菜单将所有项目保持在一侧,甚至忽略菜单的水平内容对齐或菜单项的水平对齐

但你可以做个变通。保证金财产有效。因此,我认为您可以将帮助菜单项的边距绑定到菜单的宽度。但是您必须使用转换器从宽度计算边距


我不知道这样做是否有好处。我不会的。但是如果你真的想要,这是一种可行的方法。

另一个可能的答案,如果你总是知道会有多少菜单项(这使得这个答案很脆弱),那就是将menu.ItemsPanel定义为网格,将菜单设置为拉伸,将grid.Column定义适当,将MenuItems设置为适当的grid.Column,并将最后一个菜单项的水平对齐设置为向右

   <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>

使用相同的原则,这次您不需要网格,因此不需要知道项目的数量。将所有项目分配到左侧,帮助除外:)


使用DockPanel或Grid而不是默认WrapPanel可能有一个或两个缺点

  • 如果窗口太小,无法在一行上显示所有菜单项,它们将不会换行到下一行
  • 如果菜单项将共享以在不同的上下文中使用,例如在上下文菜单中,则最后一项将右对齐
  • 
    

    只是原始答案的一个小补充。包括两个流向使子菜单保持在窗口内。

    更改原始答案,因为(使用HorizontalAlignment=“Stretch”)编辑菜单将一直延伸到菜单栏的帮助菜单

    还包括Rokke的子菜单对齐建议

    <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>
    
    
    
    请注意,您需要将菜单项的最大数量定义为列定义的数量。这样,如果某些菜单项设置为Visible.Collapsed,则菜单仍将正确显示,因为ColumnDefinitions设置为Auto width。这个答案很好,但我认为Leom Burke的答案更好。DockPanel也比Grid更有效。这个答案最适合我,因为它给了我完美的控制。使用dockpanel模板的其他答案仅适用于右对齐的单个按钮。其余部分即使与HorizontalAlignment=“right”对齐也不正确此方法对我有效,而该方法对我无效,对我而言,不会正确仲裁任何其他人所需的任何
    拉伸
    ,以及只能放置在最后列出的
    水平对齐=“Right”
    。这种方法使我能够微调菜单布局。谢谢你的建议,尤其是最后一句话。做了之后,它看起来不太好,所以我想我将来会和你们一起发表“我不会”的评论+1.很好。我通常在代码中很少使用dockpanel,所以我没有想到它。当然,如果要使用这种方法,可以在Menu.Resources中为MenuItem添加样式,将DockPanel.Dock设置为Left值,然后只需将DockPanel.Dock=“Right”放在最后一个MenuItem上。但是@paxdiablo——我同意——最终的结果当然有一种复古的感觉……:)我刚刚编辑了上面的内容——事实证明,如果DockPanel上有拉伸,MenuItem上有水平对齐,那么就不需要显式的dock属性。这比公认的答案“少混乱”要好;当窗口宽度小于显示所有菜单项所需的宽度时,多行菜单存在一个问题。这非常有效,但右侧不能有多个菜单项。另一种方法是创建两个菜单并使用网格(左和右)对齐它们。在这种情况下,键盘的可访问性会发生变化,因此请务必检查它。
    <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>
    
    <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>
    
    <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>