[英]Disabled context menu won't disappear after rightclick
我有一个ContextMenu
作为TabControl
一部分,例如:
<TabControl Name="MyTabControl">
<TabControl.ContextMenu>
<ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True">
<MenuItem Header="Item1"></MenuItem>
...
</ContextMenu>
</TabControl.ContextMenu>
</TabControl>
如您所见,菜单已禁用。 它将在程序的后面启用,但是现在,它应该保持禁用状态。 问题是,当我右键单击TabControl
并显示禁用的菜单时,它只是停留在首次打开的位置,没有其他右键单击将其移动,也不会在某个位置单击鼠标左键使其消失。
摆脱它的唯一方法是,先启用它,然后单击MyContextMenu.Visibility = Visibility.Collapsed/Hidden;
右键/左键,或者使用MyContextMenu.Visibility = Visibility.Collapsed/Hidden;
我尝试将StaysOpen
设置为False
。 然后,菜单将在其禁用状态下打开一次。 左键单击后消失,即使启用了它也不会再次出现。
解决此问题的唯一方法可能是更改StaysOpen
属性以及IsEnabled
属性,但是菜单在禁用状态下仅打开一次,然后再不打开,这StaysOpen
。
我希望任何人都可以向我解释,为什么完全禁用的菜单不会关闭,而属性StaysOpen
为false则StaysOpen
将其打开一次,因为在我看来这是一种奇怪的行为。
似乎上下文菜单项的行为非常奇怪-您所描述的是在.Net 4.0中,如果您将应用定位到.Net 3.5,例如,您会注意到相反的行为-您无法使菜单停留如果禁用了单个项目,则打开,在右键单击显示后它会立即消失。
但是,我认为管理上下文菜单项的启用状态(以及它应执行的OnClick操作)的首选方法是通过Command
。
首先,您应该为视图指定一个数据上下文,假设它是ViewModel.cs
类。 然后通过实现ICommand
接口创建命令,如下所示:
public class MyCommand : ICommand
然后,您有一个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>
在这里,您的ItemsSource
( Items
)例如是List<MenuItem>
,而MenuItem
itselw将是每个菜单项的模型(在MVVM中考虑),该菜单项应具有属性Header
,该属性包含要在每个菜单项中看到的标题。 可以像在我的虚拟示例中那样将IsEnabled
设置为false
,而不是将其绑定到属性,以便控制何时必须为true和false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.