如何根据WPF中的情况自定义菜单? 我有一个带有基本菜单的主窗口。在这个窗口中,我可以加载不同的UserControls,然后我希望根据使用的用户控件,使用不同的菜单选项扩展菜单。
示例:
Main menu:
File
Open
-
MRU
-
Exit
For viewing of UserControl 1:
File
Open
Edit
-
MRU
-
Exit
For viewing of UserControl 2:
File
Open
Edit
-
MRU
-
Exit
View
Show codes
Show capital letters
In Editing
File
Open
Save
Save as...
-
MRU
-
Exit
Edit
Add
Remove
Move
-
Cancle Edit
答案 0 :(得分:5)
我会将菜单绑定到Collection,并在加载时让不同的UserControls更改Collection。
编辑 - 这是一个例子
您的主视图将包含类似
的内容<Menu ItemsSource="{Binding Path=CurrentUserControl.MenuItems}">
<Menu.Resources>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding MenuItemText}" />
<Setter Property="Command" Value="{Binding MenuItemCommand}" />
<Setter Property="CommandParameter" Value="{Binding MenuItemCommandParameter}" />
</Style>
</Menu.Resources>
</Menu>
虽然每个UserControl都包含您想要显示的MenuItem的Collection属性
public class MenuItem
{
public string MenuItemText {get; set;}
public ICommand MenuItemCommand {get; set;}
public object MenuItemCommandParameter {get; set;}
}
...
public ObservableCollection<MenuItem> MenuItems;
答案 1 :(得分:1)
您可以使用CompositeCollection将多个集合合并为一个集合。 按照1的示例:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Grid Background="Transparent">
<Grid.Resources>
<x:Array Type="{x:Type sys:Object}" x:Key="extensions">
<Separator />
<MenuItem Header="Extension MenuItem 1" />
<MenuItem Header="Extension MenuItem 2" />
<MenuItem Header="Extension MenuItem 3" />
</x:Array>
</Grid.Resources>
<Grid.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<MenuItem Header="Standard MenuItem 1" />
<MenuItem Header="Standard MenuItem 2" />
<MenuItem Header="Standard MenuItem 3" />
<CollectionContainer Collection="{StaticResource extensions}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</Window>
答案 2 :(得分:0)
我确实找到了解决方案:http://www.codeproject.com/KB/menus/WPFMergeMenu.aspx 但应该有更好的东西
答案 3 :(得分:0)
如何将某些菜单选项的可见性绑定到ViewModel中的布尔值,并使用IValueConverter在Visible和Collapsed之间切换?
答案 4 :(得分:0)
一种简单的方法是在代码后面构建一系列if-then结构,以根据用户控件的可见性更改各种菜单项的可见性。