magol
magol

Reputation: 6273

Customize the menu depending on situation in WPF

How can I customize the menu to the situation in WPF? I have a main window with a basic menu. In this window, I can load different UserControls and then I want the menu to be expanded with different menu options depending on which User Control is used.

Example:

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

Upvotes: 1

Views: 1303

Answers (5)

CodeMouse92
CodeMouse92

Reputation: 6898

A simple approach is to build a series of if-then constructs in your code behind, to change the visibility of various menu items, depending on what user controls are visible.

Upvotes: 0

PawelSt
PawelSt

Reputation: 846

You can use the CompositeCollection to merge multiple collection into one. Following the example from 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>

Upvotes: 1

Rachel
Rachel

Reputation: 132618

I would bind the menu to a Collection, and have the different UserControls alter the Collection when loaded.

EDIT - Here's an example

Your main View would contain something like this

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

While each UserControl would contain a Collection property of the MenuItems you would like to display

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

...

public ObservableCollection<MenuItem> MenuItems;

Upvotes: 5

Captain Garforce
Captain Garforce

Reputation: 608

How about binding the visibility of certain menu options to booleans in the ViewModel, and using an IValueConverter to switch between Visible and Collapsed?

Upvotes: 0

magol
magol

Reputation: 6273

I did found a solution: http://www.codeproject.com/KB/menus/WPFMergeMenu.aspx But there should be something better

Upvotes: 0

Related Questions