Настройте меню в зависимости от ситуации в WPF - PullRequest
1 голос
/ 20 августа 2010

Как мне настроить меню в соответствии с ситуацией в 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 ]

5 голосов
/ 20 августа 2010

Я бы привязал меню к Коллекции, и чтобы различные пользовательские элементы управления изменяли Коллекцию при загрузке.

РЕДАКТИРОВАТЬ - Вот пример

Ваш главный вид будет содержать что-то вроде этого

<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 будет содержать свойство Collection элементов MenuItem, которые вы хотите отобразить

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

...

public ObservableCollection<MenuItem> MenuItems;
1 голос
/ 02 апреля 2011

Вы можете использовать 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 голосов
/ 04 апреля 2011

Простой подход заключается в создании ряда конструкций if-then в вашем коде, чтобы изменить видимость различных пунктов меню в зависимости от того, какие пользовательские элементы управления видимы.

0 голосов
/ 30 марта 2011

Как насчет привязки видимости некоторых параметров меню к логическим значениям в ViewModel и использования IValueConverter для переключения между Visible и Collapsed?

0 голосов
/ 24 марта 2011

Я нашел решение: http://www.codeproject.com/KB/menus/WPFMergeMenu.aspx Но должно быть что-то лучше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...