c#WinForms - 单击某些项目后,使ContextMenu不会关闭

Aid*_*dan 11 c# contextmenu

我正在使用System.Windows.Forms.ContextMenu.我想这样做,当你点击一些按钮时,它不会关闭菜单.现在我让它工作的地方,无论何时你点击一个,它将在相同的位置重新打开菜单.唯一的问题是它看起来很糟糕,因为你可以看到菜单闪烁.有没有更好的方法来做到这一点?

WPF的ContextMenu具有StaysOpen属性,但Win Forms没有.(有什么方法可以使用WPF的ContextMenu吗?)我不想使用ContextMenuStrip,它可以做到这一点,因为ContextMenu看起来好多了.

编辑:

我不打算将此标记为解决方案,因为这样做并不好.如果你需要做我的问题请求,一种方法是从WPF创建UserControl,然后将对象与上下文菜单放在其中,然后添加上下文菜单.现在因为它在WPF中,在按钮上你不想在点击时关闭菜单,在MenuItem上将属性StaysOpenOnClick设置为true.然后将这个UserControl放入你的WinForms应用程序.

Cod*_*ker 20

您可以像这样打开上下文菜单:

private bool CloseContextMenu = true; //Class Variable
Run Code Online (Sandbox Code Playgroud)

然后将MouseDown添加到上下文菜单项:

private void menu1ToolStripMenuItem_MouseDown(object sender, MouseEventArgs e)
{
    CloseContextMenu = false;
}
Run Code Online (Sandbox Code Playgroud)

然后在您的上下文菜单关闭事件:

private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    e.Cancel = !CloseContextMenu;
    CloseContextMenu = true;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加CloseContextMenu = false到所需的任何菜单事件.

希望这可以帮助.


Cod*_*ray 6

使用ContextMenu控件无法做到这一点.那个只是原生Win32菜单的包装器,这就是为什么它看起来好多了.它使用OS API绘制,就像所有其他应用程序中的菜单一样.

将其与ContextMenuStrip控件进行比较,该控件完全由C#代码中的框架自定义绘制.当Windows和Office XP成为货架上的最新产品时,它首次发布时看起来非常酷(我猜).当Windows Vista推出时,它变得非常过时.它唯一的优势有是你必须在菜单中多了很多细粒度的控制.例如,您可以在菜单中托管自定义控件,并且可以在单击其中一个项目时阻止菜单关闭.本机Win32菜单不支持.

当然,这不仅仅是疏忽或意外遗漏.在用户选择了某些内容之后保持上下文菜单打开的愿望是一个很好的线索,表明您的设计是错误的.请记住,上下文菜单的目的是让用户快速访问与上下文相关的选项.他们所要做的就是右键单击(或按下键盘上的一个特殊按钮),他们可以看到一个与他们正在工作或试图完成的内容直接相关的选项菜单.就像常规菜单一样,他们应该能够选择一个选项并让菜单消失.

在Windows中,所有菜单都是"自动关闭".如果菜单应该是持久的,那么它根本不应该是菜单.请考虑使用工具栏,侧栏或某种类型的自定义控件.当选择其中一个选项时,这些选项并不会消失,因此它们非常适合显示应始终可见的相关选项.

如果我选择一个选项后应用程序中的上下文菜单没有消失,我会认为这是一个错误.至少,我假设我的选择没有"采取"并再次尝试点击它.

我没有丝毫的线索,为什么WPF团队决定StaysOpen为他们的上下文菜单提供一个选项,或者为什么他们首先重写了他们自己的上下文菜单类.难道他们没有从WinForms团队那里学到一些东西吗?

使用ContextMenu控件(以及原生菜单)执行操作的唯一方法是类似于您描述的黑客 - 存储菜单的先前位置,并且在选择命令后,重新显示弹出窗口 -在以前的位置菜单.无论你为闪烁提出什么治疗方法(例如,冻结屏幕并抑制重新涂抹,直到上下文菜单被重新显示)几乎可以保证比疾病更糟糕.

  • 有点晚了,但是我忘了添加:ContextMenu中的按钮是复选框按钮,我不希望在按钮中更改检查状态时关闭菜单.你可以看到它检查/取消选中,所以我认为它看起来不像你说的那样. (2认同)