避免 ToolStripMenuItem 上下文菜单在单击时关闭。

5
我正在尝试使上下文菜单在单击其下拉项后仍保留在屏幕上(当按下Shift键时,虽然我认为这与问题无关)。您可以在Windows XP中点击“开始>所有程序>附件>[现在按下Shift键]”并单击“Windows资源管理器”,查看此行为的示例。菜单将保持打开状态。

这是一个使用Winforms的C#应用程序,开发计算机是Windows 7,生产环境是XP、Vista或7。

工具栏菜单项似乎没有“closing”事件,只有“closed”事件。熟悉“closing”事件的人将知道您可以设置“cancel”标志以防止控件关闭。

此外,当我尝试通过在其“click”事件或“closed”事件中从内部重新制作它可见来解决问题时,它不起作用。虽然这在短期内是可以容忍的解决方法,但对于生产来说不是一个好的解决方案。

如有建议或相关信息,请提供帮助。谢谢。


更多信息:我想要防止关闭的菜单是从上下文菜单向下2级,并且是动态构建的。只有最上层的上下文菜单具有关闭事件,如果我在该事件中取消关闭,则行为似乎是上下文菜单保持打开状态,向下一级也保持打开状态,但最后一级仍然关闭。此时,我已经开始尝试将最后一级的autoclose属性设置为false,虽然这似乎有效,但它会导致其他事件在将autoclose设置回true时不再触发。 - Flood
3个回答

7

我设置了父级DropDown菜单的AutoClose属性为“False”,以便在单击动态创建的ContextMenu子菜单时,它可以保持在屏幕上:

ParentMenu.DropDown.AutoClose = false;

其中 ParentMenu 是一个 ToolStripMenuItem

通过设置“取消”标志并使用 DropDown 的父级 ToolStripDropDownMenu 的 Closing 事件来实现这一目的是不可行的,因为它会导致其两个级别的父菜单中的显示/隐藏行为不一致,并在稍后通过代码隐藏时导致无法摆脱意外的视觉效果。它还似乎使动态创建的菜单的父菜单的某些事件不再触发,例如它的 MouseEnter 事件。

在这个过程中有趣的发现是,尽管 Visual Studio 2010 的智能感知列出了上下文菜单项的 DropDownLostFocus 事件;但是,当将此事件添加到动态创建的菜单时,它不会被触发;这显然是一个已知的行为,如此处所述


5

这是我最终使用的方法。使用此方法,下拉菜单的自动关闭仅在鼠标指针位于下拉控件上时被禁用。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

你的解决方案对我很有用。我将我的方法重命名为MyDropDown_MouseEnter和MyDropDown_MouseLeave。这样,该方法看起来不会与一个功能绑定在一起。 - JDennis

3

ToolStripDropDownMenu有Closing事件。

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

谢谢Anders。我昨天看了你的评论,我一直在尝试那个方法和其他几个想法,但还没有找到解决方案。 - Flood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接