我想在WPF中制作一些自定义的MenuHeaders,以便我可以(例如)在菜单项中添加一个图标和文本。
通常使用MenuItems,如果使用直文填充标题字段,则可以使用下划线添加加速器。例如,_File
但是,如果我想放入UserControl,我相信这个功能会破坏,我该如何做类似以下的事情呢?
<Menu>
<MenuItem>
<MenuItem.Header>
<UserControl>
<Image Source="..." />
<Label Text="_Open" />
</UserControl>
</MenuItem.Header>
</MenuItem>
...
答案 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中具有特殊含义,因此我们必须使用编码版本<
。这就像一场梦!以下显示了一个floppydisk符号作为菜单项上的图标:
<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
<MenuItem.Icon>
<Label VerticalAlignment="Center" HorizontalAlignment="Center"
FontFamily="Wingdings"><</Label>
</MenuItem.Icon>
</MenuItem>
答案 3 :(得分:0)
@ a7an:啊,之前我没有注意到Icon属性。这是一个好的开始。
但是,具体来说,我想为一些MenuItem添加一个额外的“按钮”,这样我就可以拥有一个“Pin”功能(请参阅Office 2007中最近加载的文档列表中的功能概念)。
由于还需要代码,我可能需要子类化控件并添加按钮的代码吗? (不要害怕搞乱MenuItem模板,已经不得不这样做了,如果必须的话,我会再做一次!;))