4

我想在 WPF 中制作一些自定义 MenuHeaders,这样我就可以(例如)在菜单项中拥有一个图标和文本。

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

但是,如果我想放入一个 UserControl,我相信这个功能会中断,我将如何做类似以下的事情?

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

4 回答 4

7

我认为 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>
于 2008-09-13T06:34:48.413 回答
4

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

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

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

于 2008-09-12T18:30:17.453 回答
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 字体。字体中的这个符号映射到 charachter <,它在 XAML 中具有特殊含义,因此我们必须使用编码版本&lt;来代替。这就像做梦一样!下面将软盘符号显示为菜单项上的图标:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>
于 2009-07-10T09:26:27.567 回答
0

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

但是,特别是我想在一些 MenuItems 中添加一个额外的“按钮”,这样我就可以拥有一个“Pin”功能(有关该功能的想法,请参阅 Office 2007 中最近加载的文档列表)。

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

于 2008-09-13T06:15:43.247 回答