如何使用加速器在WPF中制作自定义MenuHeader?

时间:2008-09-12 16:32:29

标签: wpf xaml templates styles menu

我想在WPF中制作一些自定义的MenuHeaders,以便我可以(例如)在菜单项中添加一个图标和文本。

通常使用MenuItems,如果使用直文填充标题字段,则可以使用下划线添加加速器。例如,_File

但是,如果我想放入UserControl,我相信这个功能会破坏,我该如何做类似以下的事情呢?

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

4 个答案:

答案 0 :(得分:7)

我认为Icon属性符合您的需求 但是,要回答原始问题,可以在撰写menuitem的内容时保留Accelerator功能。 如果您在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>

答案 1 :(得分:4)

问题是您将图像放在MenuHeader的内容中,这意味着您将丢失加速键。如果您只是想在菜单标题中添加图像,请执行以下操作。

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

如果您想进一步自定义外观,请修改菜单的controltemplate和样式。根据经验,菜单和菜单项的样式比其他WPF控件的样式要困难得多。

答案 2 :(得分:2)

首先想到的是,你会认为Icon属性只能包含一个图像。但它实际上可以包含任何东西!当我以编程方式尝试将Image属性直接设置为带有图像路径的字符串时,我偶然发现了这一点。结果是它没有显示图像,而是显示路径的实际文本!然后我发现我必须首先创建一个Image元素并将其设置为Icon属性。这让我认为Image属性只是位于菜单左侧图标区域的任何内容容器,我是对的。我试着在那里放一个按钮,它有效!

这是在菜单项的Icon区域中显示带有文本“i”的按钮。单击按钮时,将触发Button_Click事件(单击按钮时不会触发LanguageMenu_Click)。

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

这导致了不必为图标制作图像的替代方法,而是使用带有符号字体的文本来显示简单的“图标”。以下示例使用包含floppydisk符号的Wingdings字体。字体中的此符号映射到charachter <,它在XAML中具有特殊含义,因此我们必须使用编码版本&lt;。这就像一场梦!以下显示了一个floppydisk符号作为菜单项上的图标:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

答案 3 :(得分:0)

@ a7an:啊,之前我没有注意到Icon属性。这是一个好的开始。

但是,具体来说,我想为一些MenuItem添加一个额外的“按钮”,这样我就可以拥有一个“Pin”功能(请参阅Office 2007中最近加载的文档列表中的功能概念)。

由于还需要代码,我可能需要子类化控件并添加按钮的代码吗? (不要害怕搞乱MenuItem模板,已经不得不这样做了,如果必须的话,我会再做一次!;))