1

我有一个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-property 设置为False. 然后菜单将在其禁用状态下打开一次。左键单击后消失,然后即使启用也不会再次出现。

解决它的唯一方法可能是更改StaysOpen-property 以及IsEnabled-property,但有点奇怪的是,菜单在禁用状态下仅打开一次,然后不再打开。

我希望任何人都可以向我解释,为什么禁用的菜单不会关闭,而StaysOpenfalse 的属性使它只打开一次,因为这对我来说似乎是一种奇怪的行为。

4

1 回答 1

0

上下文菜单项的行为似乎很奇怪 - 你所描述的是.Net 4.0,如果你将你的应用程序定位到 .Net 3.5 例如你会注意到相反的行为 - 你不能让菜单停留如果单个项目被禁用,则打开,它在右键单击后立即消失。

但是,我认为管理上下文菜单项的启用状态(以及它应该执行的 OnClick 操作)的首选方法是通过Command.

首先,您应该为您的视图指定一个数据上下文,假设它是 class 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( )将是您的每个菜单项的模型(在 MVVM 中思考),它应该具有包含您希望在每个菜单项中看到的标题的属性。您可以将其绑定到一个属性,以便控制它何时必须为真和假,而不是像我的虚拟示例中那样设置为。ItemsList<MenuItem>MenuItemHeaderIsEnabledfalse

于 2012-11-16T21:55:23.373 回答