简体   繁体   English

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

[英]How do I right-align the 'help' menu item in WPF?

I have the following (simplifed) section in my XAML file: 我的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>

and it results in: 它导致:

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

What do I need to do if I want the Help menu item on the right-hand side: 如果我想要右侧的“ Help菜单项,我该怎么办:

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

Alng the same principle and this time you dont need the grid and therefore dont need to know the number of items. Alng相同的原则,这次你不需要网格,因此不需要知道项目的数量。 Assign all items to the left except the 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>

Another possible answer, if you always know how many menu items there will be (and that makes this answer fragile), is to define the Menu.ItemsPanel as a grid, set the Menu to Stretch, set the Grid.ColumnDefinitions appropriately, set the MenuItems to the appropriate Grid.Column, and set the HorizontalAlignment of the last menu item as Right. 另一个可能的答案是,如果你总是知道有多少菜单项(这使得这个答案很脆弱),就是将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>

Alteration to the original answer, since as it is (with HorizontalAlignment="Stretch") the Edit menu will stretch all the way across the menu bar to the Help menu. 更改原始答案,因为它(使用Horizo​​ntalAlignment =“Stretch”)编辑菜单将一直延伸到菜单栏的“帮助”菜单。

Also incorporating Rokke's submenu alignment suggestion... 还结合了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>

I don't think there is an easy way. 我不认为有一个简单的方法。 Menu keeps all Items on one side and even ignores HorizontalContentAlignment of the Menu or HorizontalAlignment of the MenuItem. 菜单将所有项目保留在一侧,甚至忽略MenuItem的Menu或Horizo​​ntalAlignment的Horizo​​ntalContentAlignment。

But you could do a workaround. 但你可以做一个解决方法。 The margin property works. 保证金属性有效。 So i think you could bind the margin of the Help MenuItem to the width of the Menu. 所以我认为你可以将Help MenuItem的边距绑定到菜单的宽度。 But you would have to use a Converter to calculate the margin from the width. 但您必须使用转换器来计算宽度的边距。

I dont know if its good to do something like that. 我不知道做这样的事情是否好。 I wouldn't. 我不会。 But if you really want it, thats a way that should work. 但如果你真的想要它,那就是一种应该有效的方法。

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

Just a small addition to the original answer. 只是原始答案的一小部分。 Including the two flow directions make the sub menu stay inside the window. 包括两个流向使子菜单保持在窗口内。

There are one, perhaps two, potential drawbacks to using either a DockPanel or a Grid, instead of the default WrapPanel. 使用DockPanel或Grid,而不是默认的WrapPanel,有一个或许两个潜在的缺点。

  1. If the window is too small to show all the menu items on one line, they won't wrap to the next. 如果窗口太小而无法在一行显示所有菜单项,则它们将不会换行到下一行。
  2. If the menuitems will be shared for use in a different context, such as in a ContextMenu, the last item will be right-aligned 如果将共享菜单项以在不同的上下文中使用,例如在ContextMenu中,则最后一项将是右对齐的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM