Как правильно выровнять пункт меню «Справка» в WPF? - PullRequest
44 голосов
/ 11 июня 2010

В моем файле 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                            |
+-------------------------------------------+
|                                           |

Что мне нужно сделать, если я хочу1007 * пункт меню с правой стороны:

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

Ответы [ 6 ]

73 голосов
/ 11 июня 2010

По тому же принципу и на этот раз вам не нужна сетка и, следовательно, вам не нужно знать количество предметов.Назначьте все элементы слева, кроме помощи:)

<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>
5 голосов
/ 11 июня 2010

Другой возможный ответ, если вы всегда знаете, сколько пунктов меню будет (и это делает этот ответ хрупким), - это определить Menu.ItemsPanel как сетку, установить для меню значение Stretch, соответственно установить Grid.ColumnDefinitions. установите MenuItems для соответствующего Grid.Column и установите горизонтальное выравнивание последнего элемента меню как 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>
4 голосов
/ 30 января 2012

Изменение исходного ответа, поскольку в этом случае (с 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>
1 голос
/ 14 декабря 2011
<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>

Просто небольшое дополнение к оригинальному ответу. Включение двух направлений потока позволяет подменю оставаться внутри окна.

1 голос
/ 11 июня 2010

Я не думаю, что есть простой способ. Меню удерживает все элементы на одной стороне и даже игнорирует горизонтальное выравнивание меню или горизонтальное выравнивание элемента меню.

Но вы могли бы обойти это. Маржинальная собственность работает. Так что я думаю, что вы можете привязать поля элемента меню справки к ширине меню. Но вам придется использовать конвертер для расчета поля по ширине.

Я не знаю, хорошо ли делать что-то подобное. Я бы не стал. Но если вы действительно этого хотите, это способ, который должен работать.

0 голосов
/ 14 марта 2011

Существует один, возможно, два потенциальных недостатка использования либо DockPanel, либо Grid вместо WrapPanel по умолчанию.

  1. Если окно слишком маленькое, чтобы показывать все элементы меню на одномстроки, они не будут перенесены на следующую.
  2. Если элементы меню будут доступны для использования в другом контексте, например в ContextMenu, последний элемент будет выровнен по правому краю
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...