阻止ToolStripMenuItem上下文菜单关闭

时间:2011-07-26 06:34:13

标签: winforms events c#-4.0 controls contextmenu

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

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

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

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

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

谢谢

3 个答案:

答案 0 :(得分:5)

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

ParentMenu.DropDown.AutoClose = false;

其中ParentMenu是ToolStripMenuItem

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

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

答案 1 :(得分:4)

这是我最终使用的内容。使用此方法,仅当鼠标指针位于下拉控件上时,才会禁用下拉列表的自动关闭。 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

答案 2 :(得分:1)

ToolStripDropDownMenu具有Closing事件。

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