我有一个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;
我尝试将StaysOpen
- 属性设置为False
。然后菜单将在禁用状态下打开一次。左键单击后消失,然后即使启用也不会再次出现。
围绕它的唯一方法可能是改变StaysOpen
- 属性以及IsEnabled
- 属性,但是在禁用状态下菜单只打开一次然后不再打开它有点奇怪
我希望任何人都可以向我解释,为什么一个禁用的菜单不会关闭,而StaysOpen
属性为false会使它只打开一次,因为这对我来说似乎是一种奇怪的行为。
答案 0 :(得分:0)
上下文菜单项的行为似乎很奇怪 - 您所描述的是.Net 4.0,如果您将应用程序定位到.Net 3.5,您会注意到相反的行为 - 您无法制作如果禁用单个项目,菜单将保持打开状态,只有在右键单击显示后,菜单才会立即消失。
但是我认为管理上下文菜单项的启用状态(以及它应该执行的OnClick操作)的首选方法是Command
。
首先,您应该为视图指定一个datacontext,假设它是类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。