2010-08-20 27 views
1

如何根据WPF中的情况自定义菜单? 我有一个基本菜单的主窗口。在这个窗口中,我可以加载不同的用户控件,然后我希望根据使用的用户控件使用不同的菜单选项扩展菜单。根据WPF中的情况自定义菜单

实施例:

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 

回答

5

我将绑定菜单的集合,并且具有装在不同的用户控件改变集合。

编辑 - 下面是一个例子

主视图中会包含这样的事情

<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> 

尽管每个用户控件将包含的MenuItems的集合属性您想显示

public class MenuItem 
{ 
    public string MenuItemText {get; set;} 
    public ICommand MenuItemCommand {get; set;} 
    public object MenuItemCommandParameter {get; set;} 
} 

...

public ObservableCollection<MenuItem> MenuItems; 
+0

但是然后ui是从ViewModel创建的,它打破了MVVM。菜单应该位于相应userControl的视图中,并以任何方式与主程序中的菜单合并。 – magol 2011-03-30 08:58:51

+0

您仍然可以在视图中创建菜单,但是您可以将它们绑定到在ViewModel中定义的ItemsSource,而不是在视图中手动构建MenuItems。 – Rachel 2011-03-30 13:04:33

+0

我不确定我真的明白你的意思。是的,我创建了视图的主菜单,但是它的定制在视图模型中完成。 – magol 2011-03-30 13:53:40

0

怎么样的某些菜单选项能见度结合布尔在视图模型,并使用的IValueConverter可见光和折叠之间切换?

+0

但是,然后所有菜单在主窗口中编码。如果我想添加一个视图,那么我也必须更改主视图。 – magol 2011-03-30 09:37:37

+0

我最近可能一直在用IValueConverter太多... 也许你可以创建一个转换器,它采用菜单作为参数,将菜单“转换”为参数和值之间的合并? 然后,主窗口菜单绑定到用户控制菜单,菜单资源作为转换器参数。缺点是您必须在资源中编辑主窗口菜单。而且它不会很漂亮。 – 2011-03-30 11:21:22

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> 
0

一个简单的方法是建立一系列的if-then在你的代码构造的背后,改变各种菜单项目的可见性,这取决于用户控件是可见的。