2010-08-20 26 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在你的代碼構造的背後,改變各種菜單項目的可見性,這取決於用戶控件是可見的。