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

时间:2012-07-25 20:03:00

标签: c# contextmenu

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

WPF的ContextMenu具有StaysOpen属性,但Win Forms没有。 (有没有什么办法可以使用WPF的ContextMenu?)我不想使用ContextMenuStrip,因为ContextMenu看起来好多了。

编辑:

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

3 个答案:

答案 0 :(得分:18)

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

private bool CloseContextMenu = true; //Class Variable

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

private void menu1ToolStripMenuItem_MouseDown(object sender, MouseEventArgs e)
{
    CloseContextMenu = false;
}

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

private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    e.Cancel = !CloseContextMenu;
    CloseContextMenu = true;
}

然后,您可以将CloseContextMenu = false添加到您想要的任何菜单事件中。

希望这有帮助。

答案 1 :(得分:5)

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

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

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

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

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

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

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

答案 2 :(得分:-1)

我刚刚添加了

ContextMenuStrip1.Show();

在我的点击事件中。当我单击上下文菜单时,它会关闭,但会立即打开,因此它会有效地保持打开状态。