如何在WPF中使用加速键创建自定义菜单标题?

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

通常使用MenuItems时,如果您使用纯文本填充Header字段,可以通过使用下划线来添加加速键。例如,_File

但是,如果我想要放入一个UserControl,我相信这个功能会出现问题,我该如何做类似于以下的操作?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
4个回答

8

我认为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>

这看起来正是我所需要的,我可以在堆栈内插入一个ToggleButton以添加Pin功能,而无需创建任何自定义控件或破坏键盘使用。谢谢 :) - Nidonocu

4
问题在于您将图像放置在菜单标题的内容中,这意味着您将失去加速键。如果您只是想在菜单标题中添加图像,请按照以下步骤操作。
<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

如果您想进一步自定义外观,可以修改菜单的控制模板和样式。 从经验来看,与其他WPF控件相比,菜单和菜单项的样式更难调整。

2

初看,你可能认为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字体。该字体中的此符号被映射到字符<,在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

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

不过,具体来说,我想要在一些菜单项中添加额外的“按钮”,以便我可以拥有“固定”功能(请参见Office 2007中最近加载的文档列表的功能想法)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接