我试图让我的上下文菜单保持在屏幕上,即使我点击其中一个下拉项目(当按下shift键时,虽然我不认为这对问题很重要)。单击“开始”>可以在Windows XP中看到该行为的示例;所有程序>配件> [现在点击你的Shift键]并点击Windows资源管理器...菜单保持不变。
这是一个C#应用程序,使用Winforms,开发机器是Windows 7,生产是XP,Vista或7。
toolstripmenuitem似乎没有closing
事件;只有closed
个。那些熟悉closing
事件的人会知道您可以设置cancel
标志以防止控件关闭。
此外,当我尝试从其click
事件或其closed
事件中重新显示重构信息时,它不起作用。虽然这本来就是一种可以容忍的解决方法,但它不适合生产。
任何建议或相关信息都非常感激。
谢谢
答案 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)
这是我最终使用的内容。使用此方法,仅当鼠标指针位于下拉控件上时,才会禁用下拉列表的自动关闭。 MyMenuItem
是ToolStripMenuItem
类型。
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;
}
}