繁体   English   中英

右键单击后,禁用的上下文菜单不会消失

[英]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> 

在这里,您的ItemsSourceItems )例如是List<MenuItem> ,而MenuItem itselw将是每个菜单项的模型(在MVVM中考虑),该菜单项应具有属性Header ,该属性包含要在每个菜单项中看到的标题。 可以像在我的虚拟示例中那样将IsEnabled设置为false ,而不是将其绑定到属性,以便控制何时必须为true和false。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM