阻止ToolStripMenuItem上下文菜单关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻止ToolStripMenuItem上下文菜单关闭相关的知识,希望对你有一定的参考价值。

我试图让我的上下文菜单保持在屏幕上,即使我点击其中一个下拉项目(当按下shift键时,虽然我不认为这对问题很重要)。当您单击开始>所有程序>附件> [现在点击您的shift键]并单击Windows资源管理器时,您可以看到Windows XP中的行为示例...菜单保持不变。

它是一个C#应用程序,使用Winforms,开发机器是Windows 7,生产是XP,Vista或7。

toolstripmenuitem似乎没有closing事件;只有一个closed。那些熟悉closing事件的人会知道你可以设置一个cancel标志来阻止控件关闭。

此外,当我尝试从click事件或其closed事件中重新显示它的变通方法时,它不起作用。虽然这本来就是一种可以容忍的解决方法,但它不适用于生产。

任何建议或相关信息非常感谢。

谢谢

答案

通过将其Parent DropDown菜单的AutoClose属性设置为“False”,我可以通过动态创建我的ContextMenu子菜单停留在屏幕上,如下所示:

ParentMenu.DropDown.AutoClose = false;

其中ParentMenu是ToolStripMenuItem

使用DropDown的父ToolStripDropDownMenu的Closing事件通过设置“取消”标志来实现这一点并不是一个可行的解决方案,因为它在其2个级别的Parent菜单中导致不一致的显示/隐藏行为以及导致意外的视觉伪像在屏幕上,我以后通过代码隐藏时无法摆脱。它似乎也导致动态创建的菜单的父母不再触发某些事件,例如它的MouseEnter事件。

在这次体验中有趣的发现是,虽然Visual Studio 2010的intellisense为上下文菜单项的LostFocus列出了DropDown事件;将此事件添加到动态创建的菜单时,它不会被触发;这显然是一个已知的行为,如提到here

另一答案

这就是我最终使用的内容。使用此方法,仅当鼠标指针位于下拉控件上时,才会禁用下拉列表的自动关闭。 MyMenuItemToolStripMenuItem型。

AddHandler MyMenuItem.DropDown.MouseEnter, AddressOf DisableDropMenuClose
AddHandler MyMenuItem.DropDown.MouseLeave, AddressOf EnableDropMenuClose

Private Sub DisableDropMenuClose(ByVal sender As System.Object, ByVal e As System.EventArgs)
    CType(sender, ToolStripDropDownMenu).AutoClose = False
End Sub

Private Sub EnableDropMenuClose(ByVal sender As System.Object, ByVal e As System.EventArgs)
    CType(sender, ToolStripDropDownMenu).AutoClose = True
End Sub
另一答案

ToolStripDropDownMenu具有Closing事件。

private void MyContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e) {
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) {
        e.Cancel = true;
    }
}

以上是关于阻止ToolStripMenuItem上下文菜单关闭的主要内容,如果未能解决你的问题,请参考以下文章

menustrip控件 如何获得2级菜单个数

C# ToolStripMenuItem

使用上下文菜单在 Windows 防火墙中阻止 .EXE

ToolStripMenuItem

javascript事件相关4

contextmenustrip 通过二级菜单的点击 怎么获取当前关联控件,是二级菜单,不是一级菜单。