Общее меню WPF между главным верхним меню и контекстным меню правой кнопкой мыши - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь создать общее меню между чем-то в верхней строке меню моего приложения и контекстным меню правой кнопкой мыши в моем интерфейсе в WPF. Я гуглил aroudn, но я не могу понять, как hwo поделиться ТОЛЬКО списком пунктов меню.

Вот изображение пользовательского интерфейса, чтобы помочь описать его:

enter image description here

То, как это работает, когда выбран элемент в списке (как показано на заднем плане), это меню становится доступным для использования. Я хотел бы сделать так, чтобы при нажатии правой кнопкой мыши на элемент в списке, он также отображал то же меню. Я хотел бы избежать дублирования кода, поэтому я определил ресурс для MenuItem в моих ресурсах окна:

<MenuItem x:Key="modUtilsMenu">
    <MenuItem Header="{Binding SelectedMod.ModName}" IsEnabled="False" FontWeight="Bold" />
    <MenuItem Header="{DynamicResource string_Checkforupdates}" Command="{Binding SelectedModCheckForUpdatesCommand}" ToolTip="{DynamicResource string_tooltip_checksForUpdatesToThisMod}" >
        <MenuItem.Icon>
            <fa:ImageAwesome Style="{StaticResource EnableDisableImageStyle}" Icon="Cloud" Foreground="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" Height="16" Width="16"/>
        </MenuItem.Icon>
    </MenuItem>
    <MenuItem Header="{DynamicResource string_RestoremodfromME3Tweaks}" Command="{Binding RestoreModFromME3TweaksCommand}" ToolTip="{DynamicResource string_tooltip_forcesUpdateCheck}" >
        <MenuItem.Icon>
            <fa:ImageAwesome Style="{StaticResource EnableDisableImageStyle}" Icon="CloudDownload" Foreground="{DynamicResource {x:Static adonisUi:Brushes.ForegroundBrush}}" Height="16" Width="16" RenderOptions.BitmapScalingMode="HighQuality"/>
        </MenuItem.Icon>
    </MenuItem>
    ...

Затем я добавляю его в интерфейс как подэлемент элемента меню Mod Utils:

<MenuItem Header="{DynamicResource string_ModUtils}" Padding="4" IsEnabled="{Binding SelectedMod,  Converter={StaticResource NullEnabledConverter}}">
     <StaticResource ResourceKey="modUtilsMenu"/>
</MenuItem>

Очевидно, что это не работает, поскольку в ресурсе определен второй элемент MenuItem.

enter image description here

Однако я не уверен, как Я могу сохранить «список» пунктов меню для добавления в качестве дочерних элементов другого объекта, поскольку контейнерные элементы root в MenuItem и ContextMenu не совпадают. Это все пункты меню, основанные на командах. У меня будет та же проблема с контекстным меню - как я могу поделиться только содержимым, а не контейнером? Нужно ли выполнять привязку данных?

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

1 Ответ

1 голос
/ 20 апреля 2020

Menu и ContextMenu имеют тип ItemsControl. Вы можете обращаться с ними следующим образом, например, связать с коллекцией моделей элементов и указать DataTemplate.

. В следующем примере создается коллекция MenuItem в качестве ресурса XAML.
Чтобы разрешить несколько экземпляров Для коллекции важно установить для атрибута x:Shared значение False. В противном случае меню будет отображаться только в одном месте визуального дерева, независимо от количества ссылок:

<Window>
  <Window.Resources>
    <x:Array x:Key="SharedMenuItems" 
             Type="MenuItem" 
             x:Shared="False">
      <MenuItem Header="File">
        <MenuItem Header="Save" />
      </MenuItem>
      <MenuItem Header="Settings" />
    </x:Array>
  </Window.Resources>

  <StackPanel x:Name="RootPanel" viewModels:Item.IsMarkedAsRead="True">
    <Menu ItemsSource="{StaticResource SharedMenuItems}" />

    <Grid>
      <Grid.ContextMenu>
        <ContextMenu ItemsSource="{StaticResource SharedMenuItems}" />
      </Grid.ContextMenu>

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