Контекстное меню WinForms - не открывается в определенных частях / обнаруживает базовый элемент управления

У меня есть приложение .NET 2.0 Windows Forms. В этом приложении есть элемент управления Form со строкой меню и строкой состояния. Также в этой форме есть ListView.

Если я добавлю к этой форме контекстное меню, контекстное меню откроется, когда пользователь щелкнет правой кнопкой мыши любую часть формы, включая строку меню и строку состояния.

  1. Как я могу предотвратить открытие контекстного меню, когда щелчок произошел в строке меню / строке состояния? Я хочу, чтобы он открывался только при нажатии на «серую зону» формы.

  2. Если щелчок произошел над элементом управления в этой форме (например, в ListView), как я могу это определить? Я хотел бы знать, щелкнул ли пользователь правой кнопкой мыши над серой областью или над ListView, чтобы я мог включить / отключить некоторые элементы меню на основе этого.


person Community    schedule 20.09.2008    source источник


Ответы (2)


После того, как вы разместили строку состояния внизу и MenuStrip вверху,

  1. Установите для ContextMenuStrip в вашей форме значение None
  2. Поместите стандартную панель посередине (между MenuStrip и StatusStrip), установив для свойства Dock значение Fill.
  3. Установите свойство ContextMenuStrip на своей Panel (а не в форме).

И поместите ListView и все другие элементы управления, которые должны входить в форму, на Panel

Eg

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

Menustrip

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

Панель. Док = Заливка. ContextMenuStrip = yourContextMenu.

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

StatusStrip

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

person andynil    schedule 20.09.2008

Я нашел ответ:

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

Это должно дать базовый элемент управления, который был нажат в форме, или null, если щелчок был в серой области. Итак, нам просто нужно проверить тип элемента управления в событии открытия контекстного меню. Если это MenuStrip, ToolStrip или StatusStrip, сделайте e.Cancel = true ;.

person Community    schedule 20.09.2008