如何右对齐WPF中的“帮助”菜单项?

时间:2010-06-11 14:33:12

标签: 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">
        <MenuItem Header="Cut"/>
    </MenuItem>
    <MenuItem Header="Help">
        <MenuItem Header="About"/>
    </MenuItem>
</Menu>

,结果是:

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

如果我想要右侧的Help菜单项,我该怎么办?

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

6 个答案:

答案 0 :(得分:73)

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

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

答案 1 :(得分:5)

另一个可能的答案是,如果你总是知道会有多少菜单项(这会使这个答案变得脆弱),就是将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>

答案 2 :(得分:3)

更改原始答案,因为它(使用Horizo​​ntalAlignment =“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>

答案 3 :(得分:1)

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

但你可以做一个解决方法。保证金属性有效。所以我认为你可以将Help MenuItem的边距绑定到菜单的宽度。但是你必须使用转换器来计算宽度的余量。

我不知道做这样的事情是否好。我不会。但如果你真的想要它,那就是应该有效的方法。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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