1

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

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

  1. 当单击菜单栏/状态栏时,如何防止上下文菜单打开?我希望它仅在单击表单的“灰色区域”时打开。

  2. 如果单击发生在此窗体上的控件上方(例如,在 ListView 上),我如何识别它?我想知道用户是否右键单击了灰色区域上方或 ListView 上方,因此我可以基于此启用/禁用某些菜单项。

4

2 回答 2

3

将 Statusbar 放在底部并将 MenuStrip 放在顶部之后,

  1. 将表单上的 ContextMenuStrip 设置为None
  2. 在中间放置一个标准面板(在 MenuStrip 和 StatusStrip 之间),并将Dock属性设置为Fill
  3. 在Panel上(而不是在窗体上)设置 ContextMenuStrip 属性。

并将 ListView 和所有其他应该进入Panel表单的控件

例如

~~~~~~~~~~~~~

菜单条

~~~~~~~~~~~~~

控制板。停靠=填充。ContextMenuStrip=你的上下文菜单。

~~~~~~~~~~~~~

状态条

~~~~~~~~~~~~~

于 2008-09-20T20:53:21.260 回答
1

我找到了答案:

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

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

于 2008-09-20T20:50:06.167 回答