WinForms上下文菜单-在某些部分中未打开/检测底层控件

时间:2020-03-06 14:29:32  来源:igfitidea点击:

我有一个.NET 2.0 Windows窗体应用程序。在此应用上,有一个带有菜单栏和状态栏的窗体控件。在此表单上也有一个ListView。

如果我向该表单添加上下文菜单,则当用户右键单击表单的任何部分(包括菜单栏和状态栏)时,上下文菜单将打开。

  • 在菜单栏/状态栏上单击时如何防止上下文菜单打开?我希望仅在单击表单的"灰色区域"时打开它。
  • 如果单击发生在此表单上的控件上方(例如,在ListView上),那么我如何识别呢?我想知道用户是在灰色区域上方还是在ListView上方单击鼠标右键,因此我可以基于此启用/禁用某些菜单项。

解决方案

我找到了答案:

Point clientPos = this.PointToClient(Form.MousePosition);
Control control = this.GetChildAtPoint(clientPos);

这应该提供在窗体上单击的基础控件;如果单击在灰色区域,则为null。因此,我们只需要在上下文菜单的Opening事件上测试控件的类型。如果是MenuStrip,ToolStrip或者StatusStrip,请执行e.Cancel = true;。

将状态栏放在底部,菜单栏位于顶部之后,

  • 将窗体上的ContextMenuStrip设置为"无"
  • 将标准面板放置在中间(在MenuStrip和StatusStrip之间),并将Dock属性设置为Fill。
  • 在面板上(而不是在窗体上)设置ContextMenuStrip属性。

并将ListView和所有其他控件放入面板中的表单中

例如


菜单条

控制板。 Dock =填充。 ContextMenuStrip =ContextMenu。


状态条