C# 已禁用关联菜单赢得';右键单击后不会消失
我有一个C# 已禁用关联菜单赢得';右键单击后不会消失,c#,wpf,contextmenu,tabcontrol,C#,Wpf,Contextmenu,Tabcontrol,我有一个上下文菜单作为选项卡控件的一部分,例如: <TabControl Name="MyTabControl"> <TabControl.ContextMenu> <ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True"> <MenuItem Header="Item1"></MenuItem>
上下文菜单作为选项卡控件的一部分,例如:
<TabControl Name="MyTabControl">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True">
<MenuItem Header="Item1"></MenuItem>
...
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
...
如您所见,菜单被禁用。它将在程序中稍后启用,但目前应保持在禁用状态。问题是,当我右键单击选项卡Control
时,禁用的菜单显示,它只是停留在最初打开的位置,其他右键单击不会移动它,左键单击也不会使它消失
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
摆脱它的唯一方法是启用它,然后右键/左键单击,或者使用MyContextMenu.Visibility=Visibility.Collapsed/Hidden代码>
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
我尝试将StaysOpen
-属性设置为False
。然后,菜单将在禁用状态下打开一次。左键单击后消失,然后即使启用也不会再次出现
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
唯一的解决方法是将StaysOpen
-属性与IsEnabled
-属性一起更改,但菜单在禁用状态下只打开一次,然后就不再打开,这有点奇怪
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
我希望任何人都能向我解释,为什么禁用的菜单无法关闭,而属性StaysOpen
at false使它只打开一次,因为对我来说,这似乎是一种奇怪的行为。上下文菜单项的行为似乎很奇怪-您所描述的是在.Net 4.0中,例如,如果您将您的应用程序定位到.Net 3.5,您将注意到相反的行为-如果单个项被禁用,您无法使菜单保持打开状态,它在右键单击显示后立即消失
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
但是,我认为管理上下文菜单项的启用状态(以及它应该执行的OnClick操作)的首选方法是使用命令
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
首先,您应该为视图指定一个datacontext,假设它是类ViewModel.cs
。然后通过实现ICommand
接口创建一个命令,如下所示:
public class MyCommand : ICommand
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
然后你有一个CanExecute
方法,它完全按照它的名字来执行-决定命令是否可以执行。菜单项的启用状态也取决于此方法的返回值。因此,只要您需要,就可以让它返回false
,菜单将正常运行,菜单项将被禁用。然后,当您需要时,您可以使它返回true
(通过方法本身中的某些逻辑),并且您将再次拥有一个正常工作的上下文菜单,该菜单项已启用
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
如果要禁用整个菜单,请使用与菜单相同的方法
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
如果您需要禁用菜单中的所有项目(我认为这与整个菜单不同),则可以使用以下内容:
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
在这里,您的项目资源(项目
)例如是列表
,而菜单项
本身就是您每个菜单项的模型(在MVVM中思考),它应该具有属性标题
,其中包含您希望在每个菜单项中看到的标题。在我的虚拟示例中,您可以将IsEnabled
设置为false
,而不是将其绑定到属性,以便控制何时必须为true和false。而不是禁用ContextMenu
尝试设置为null。显示禁用上下文菜单有什么用?当我将其设置为null时,它只是“消失”了,不是吗?我在WPF代码中定义菜单,因为它更简单,在程序中的某一点之前不需要它。假设我在TabControl
的一个选项卡中有某些项目,并且只想在程序开始时启用某些项目的菜单,任何选项卡中都没有项目。由于存在相同的问题,我找到了以下解决方法:不是设置contextMenu.IsEnabled=false
而是设置contextMenu中的所有项目。项目集合IsEnabled
设置为false
,我希望您意识到我没有禁用某个项目,而是禁用整个菜单。因为我偶尔会通过将IsEnabled
-属性设置为false来禁用项目,这非常有效。好的,对菜单使用相同的方法:)
<TabControl Name="MyTabControl" Background="Green">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" StaysOpen="True" ItemsSource="{Binding Items}">
<ContextMenu.ItemTemplate>
<DataTemplate >
<MenuItem Header="{Binding Header}" IsEnabled="False" />
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>