Как сделать пользовательские MenuHeaders в WPF с ускорителями? - PullRequest
4 голосов
/ 12 сентября 2008

Я хотел бы сделать несколько пользовательских заголовков меню в WPF, чтобы я мог иметь (например) значок и текст в пункте меню.

Обычно, используя MenuItems, если вы заполняете поле Header прямым текстом, вы можете добавить ускоритель, используя подчеркивание. например, _File

Однако, если бы я хотел вставить UserControl, я считаю, что эта функция сломалась бы, как бы я сделал что-то похожее на следующее?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...

Ответы [ 4 ]

7 голосов
/ 13 сентября 2008

Я думаю, что свойство Icon соответствует вашим потребностям.
Однако, чтобы ответить на первоначальный вопрос, можно сохранить функциональность ускорителя при составлении содержимого элемента меню. Если у вас есть вложенный контент в MenuItem, вам нужно явно определить свойство AccessText , как в первом примере ниже. Когда вы используете встроенную форму, об этом автоматически заботятся.

 <Menu> 
   <MenuItem>
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <Image Source="Images/Open.ico" />      
          <AccessText>_Open..</AccessText>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
    <MenuItem Header="_Close" />
   </Menu>
4 голосов
/ 12 сентября 2008

Проблема в том, что вы поместили изображение внутри содержимого MenuHeader, что означает, что вы потеряете клавишу ускорения. Если вы просто пытаетесь добавить изображение в заголовок меню, сделайте следующее.

<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

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

2 голосов
/ 10 июля 2009

Сначала вы подумали, что свойство Icon может содержать только изображение. Но на самом деле он может содержать что угодно! Я обнаружил это случайно, когда программно попытался установить свойство Image непосредственно в строку с путем к изображению. В результате он показал не изображение, а фактический текст пути! Затем я обнаружил, что сначала нужно создать элемент Image и установить для него свойство Icon. Это привело меня к мысли, что свойство Image было просто любым контейнером содержимого, который расположен в области значков слева в меню, и я был прав. Я попытался поставить кнопку там, и это сработало!

Это показывает кнопку с текстом «i» в области значков пункта меню. Когда вы нажимаете на кнопку, событие Button_Click запускается (LanguageMenu_Click НЕ запускается при нажатии кнопки).

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click">
  <MenuItem.Icon>
    <Button Click="Button_Click">i</Button>
  </MenuItem.Icon>
</MenuItem>

Это приводит к тому, что альтернативе не нужно создавать изображение для значка, а вместо этого использовать текст с символьным шрифтом для отображения простого «значка». В следующем примере используется шрифт Wingdings, который содержит символ floppydisk. Этот символ в шрифте сопоставляется с символом <, который имеет особое значение в XAML, поэтому мы должны использовать вместо этого закодированную версию &lt;. Это работает как мечта! Ниже показан символ дискеты в виде значка в пункте меню:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>
0 голосов
/ 13 сентября 2008

@ a7an: Ах, я раньше не замечал свойства Icon. Это хорошее начало.

Однако, в частности, я хотел добавить дополнительную «кнопку» к некоторым элементам меню, чтобы у меня была функция «Закрепить» (см. Список недавно загруженных документов в Office 2007 для получения информации о функции).

Так как также должен быть код, мне, вероятно, нужно будет создать подкласс элемента управления и добавить код для кнопки? (Не боюсь возиться с шаблоном MenuItem, уже пришлось сделать это один раз, и я бы сделал это снова, если бы мне пришлось!;))

...