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。
状态条