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

时间:2012-11-15 09:17:43

标签: c# wpf contextmenu tabcontrol

我有一个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会使它只打开一次,因为这对我来说似乎是一种奇怪的行为。

1 个答案:

答案 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> 

此处,ItemsSourceItems)例如List<MenuItem>,而MenuItem itselw将是您的每个菜单项的模型(在MVVM中思考),应该包含属性Header,其中包含您希望在每个菜单项中看到的标题。您可以将其绑定到属性,而不是将IsEnabled设置为false,以便控制何时必须为true和false。