根据WPF中的情况自定义菜单

时间:2010-08-20 09:31:32

标签: c# wpf xaml mvvm binding

如何根据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

5 个答案:

答案 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结构,以根据用户控件的可见性更改各种菜单项的可见性。