Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已禁用关联菜单赢得';右键单击后不会消失_C#_Wpf_Contextmenu_Tabcontrol - Fatal编程技术网

C# 已禁用关联菜单赢得';右键单击后不会消失

C# 已禁用关联菜单赢得';右键单击后不会消失,c#,wpf,contextmenu,tabcontrol,C#,Wpf,Contextmenu,Tabcontrol,我有一个上下文菜单作为选项卡控件的一部分,例如: <TabControl Name="MyTabControl"> <TabControl.ContextMenu> <ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True"> <MenuItem Header="Item1"></MenuItem>

我有一个
上下文菜单作为
选项卡控件的一部分,例如:

<TabControl Name="MyTabControl">
    <TabControl.ContextMenu>
        <ContextMenu Name="MyContextMenu" IsEnabled="False" StaysOpen="True">
            <MenuItem Header="Item1"></MenuItem>
            ...
        </ContextMenu>
    </TabControl.ContextMenu>
</TabControl>
<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> 

...
如您所见,菜单被禁用。它将在程序中稍后启用,但目前应保持在禁用状态。问题是,当我右键单击
选项卡Control
时,禁用的菜单显示,它只是停留在最初打开的位置,其他右键单击不会移动它,左键单击也不会使它消失

<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> 
摆脱它的唯一方法是启用它,然后右键/左键单击,或者使用
MyContextMenu.Visibility=Visibility.Collapsed/Hidden

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

<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> 
唯一的解决方法是将
StaysOpen
-属性与
IsEnabled
-属性一起更改,但菜单在禁用状态下只打开一次,然后就不再打开,这有点奇怪

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

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

上下文菜单项的行为似乎很奇怪-您所描述的是在.Net 4.0中,例如,如果您将您的应用程序定位到.Net 3.5,您将注意到相反的行为-如果单个项被禁用,您无法使菜单保持打开状态,它在右键单击显示后立即消失

<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> 
但是,我认为管理上下文菜单项的启用状态(以及它应该执行的OnClick操作)的首选方法是使用
命令

<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> 
首先,您应该为视图指定一个datacontext,假设它是类
ViewModel.cs
。然后通过实现
ICommand
接口创建一个命令,如下所示:

public class MyCommand : ICommand
<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> 
然后你有一个
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> 
如果要禁用整个菜单,请使用与菜单相同的方法

<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> 
如果您需要禁用菜单中的所有项目(我认为这与整个菜单不同),则可以使用以下内容:

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


在这里,您的
项目资源(
项目
)例如是
列表
,而
菜单项
本身就是您每个菜单项的模型(在MVVM中思考),它应该具有属性
标题
,其中包含您希望在每个菜单项中看到的标题。在我的虚拟示例中,您可以将
IsEnabled
设置为
false
,而不是将其绑定到属性,以便控制何时必须为true和false。

而不是禁用
ContextMenu
尝试设置为null。显示禁用上下文菜单有什么用?当我将其设置为null时,它只是“消失”了,不是吗?我在WPF代码中定义菜单,因为它更简单,在程序中的某一点之前不需要它。假设我在
TabControl
的一个选项卡中有某些项目,并且只想在程序开始时启用某些项目的菜单,任何选项卡中都没有项目。由于存在相同的问题,我找到了以下解决方法:不是设置
contextMenu.IsEnabled=false
而是设置contextMenu中的所有项目。项目集合
IsEnabled
设置为
false
,我希望您意识到我没有禁用某个项目,而是禁用整个菜单。因为我偶尔会通过将
IsEnabled
-属性设置为false来禁用项目,这非常有效。好的,对菜单使用相同的方法:)
<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>