В WPF как правильно выровнять пункты меню, сохраняя сочетания клавиш? - PullRequest
3 голосов
/ 10 октября 2010

Я недавно изменил свой XAML, чтобы получить возможность выравнивать по правому краю пункты меню, такие как установка размеров шрифта на рисунке ниже:

File  Configure  Help
      +-------------+  +----+
      | Font size > |->|  8 |
      | Speed     > |  | 10 |
      +-------------+  | 12 |
                       +----+

Очевидно, исходя из этой графики, я не буду переходить от технической роли к графическому дизайну в ближайшее время :-) Это больше, чем просто иллюстрировать, что я имел в виду.

Исходный XAML ниже не выровнял значения вправо

<MenuItem Header="_Configure">
    <MenuItem Header="_Font size   ">
        <MenuItem Header="_8" Click="menuConfigFontSz8" />
        <MenuItem Header="1_0" Click="menuConfigFontSz10" />
        <MenuItem Header="1_2" Click="menuConfigFontSz12" />
    </MenuItem>
    :
</MenuItem>

Вместо этого он дал мне:

File  Configure  Help
      +-------------+  +----+
      | Font size > |->| 8  |
      | Speed     > |  | 10 |
      +-------------+  | 12 |
                       +----+

Итак, чтобы получить правильное обоснование, я изменил его на:

<MenuItem Header="_Configure">
    <MenuItem Header="_Font size   ">
        <MenuItem Click="menuConfigFontSz8">
            <MenuItem.Header>
                <TextBlock HorizontalAlignment="Right">_8</TextBlock>
            </MenuItem.Header>
        </MenuItem>
        <MenuItem Click="menuConfigFontSz10">
            <MenuItem.Header>
                <TextBlock HorizontalAlignment="Right">1_0</TextBlock>
            </MenuItem.Header>
        </MenuItem>
        <MenuItem Click="menuConfigFontSz12">
            <MenuItem.Header>
                <TextBlock HorizontalAlignment="Right">1_2</TextBlock>
            </MenuItem.Header>
        </MenuItem>
    </MenuItem>
    :
</MenuItem>

Тем не менее, я обнаружил, что потерял возможность быстрого вызова Alt C , F , 0 для выбора размера шрифта 10 (это просто 0 бит, который больше не работает, первые два бита все еще в порядке).

Вместо этого он дает мне буквальный текст 1_0 в самом меню, а не позволяет мне использовать 0 в качестве быстрого способа выбора элемента:

File  Configure  Help
      +-------------+  +-----+
      | Font size > |->|  _8 |
      | Speed     > |  | 1_0 |
      +-------------+  | 1_2 |
                       +-----+

Как мне сохранить правильное выравнивание текста меню, но по-прежнему использовать ускоритель?

1 Ответ

2 голосов
/ 10 октября 2010

Когда вы добавляете ускоритель к MenuItem (и кнопке), WPF автоматически добавляет TextBlock к вашему MenuItem, и это, вероятно, препятствует работе вашего кода.Вы можете увидеть этот эффект, если взгляните на ответ на этот вопрос .

Этот код решает проблему, если у вас нет общего стиля TextBlock вваши ресурсы, которые переопределяют поведение TextBlock по умолчанию.

<MenuItem Header="_Configure"> 
  <MenuItem Header="_Font size"> 
    <MenuItem Click="menuConfigFontSz8" Header="_8" HorizontalAlignment="Right"/>
    <MenuItem Click="menuConfigFontSz10" Header="1_0" HorizontalAlignment="Right"/>
    <MenuItem Click="menuConfigFontSz12" Header="1_2" HorizontalAlignment="Right"/>
</MenuItem> 
...