gpt4 book ai didi

c# - 主顶部菜单和右键单击上下文菜单之间的 WPF 共享菜单

转载 作者:行者123 更新时间:2023-12-04 10:11:08 24 4
gpt4 key购买 nike

我正在尝试在我的应用程序顶部菜单栏上的某些内容和 WPF 界面中某些内容的右键单击上下文菜单之间创建一个共享菜单。我已经用谷歌搜索了 aroudn,但我不知道如何只分享 menuitems 列表。

这是帮助描述它的 UI 图片:

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

但是,我不确定如何存储菜单项的“列表”以添加为另一个对象的子项,因为 MenuItem 和 ContextMenu 的根容器元素不一样。这些都是基于命令的菜单项。我也会在上下文菜单中遇到同样的问题 - 我如何只共享内容而不共享容器?我必须进行数据绑定(bind)吗?

我看过 How do I share a menu definition between a context menu and a regular menu in WPF ,但这似乎只适用于单个菜单项。我想我可以为他们每个人都这样做,但我正在寻找是否有一种方法可以做到这一点,我只需要在一个地方而不是三个地方更新它就可以让它工作。

最佳答案

MenuContextMenu都是 ItemsControl 类型.你可以这样对待他们,例如绑定(bind)到项目模型集合并指定 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>

关于c# - 主顶部菜单和右键单击上下文菜单之间的 WPF 共享菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61327699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com