WinForm: объединение ContextMenuStrip MenuItem с существующим меню в VS2010

Я добавил несколько пользовательских MenuItem возражает против ContextMenuStrip контроль.

Однако добавление моих объектов полностью уничтожило очень полезные пункты меню, которые уже существовали в элементах управления (TreeView, TextBox, а также DataGridView).

Кто-нибудь смог успешно объединить эти предметы?

1 ответ

Решение

Нет, вы не можете их объединить. Вам придется дублировать функциональность самостоятельно, добавив соответствующие пункты меню и написав необходимый код в их Click методы обработчика событий.

Общие элементы управления предоставляют это меню по умолчанию. Если вы хотите переопределить его, вы можете сделать это, но нет встроенного условия для объединения ваших пользовательских элементов со встроенным меню. Некоторые воспользовались этим как функцией, назначив пустой ContextMenu или же ContextMenuStrip к элементу управления, чтобы предотвратить отображение стандартного меню (поговорим о запутанном дизайне пользовательского интерфейса!).

Для TextBox В частности, я настоятельно рекомендую оставить контекстное меню по умолчанию как есть, а не пытаться заново его создать. Есть много вариантов, которые он предлагает для таких вещей, как IME, которые чрезвычайно трудно понять правильно. Если вы нацеливаете свое приложение на широкую публику, они очень оценят, что такая функциональность существует в вашем приложении, как и ожидалось.

Лучше всего размещать пользовательские функции где-то еще. Щелкнув правой кнопкой мыши по общему элементу управления и ожидая увидеть список настраиваемых опций, довольно не интуитивно. Большинство других приложений не работают именно по этой причине.


Если, несмотря на мои рекомендации об обратном, вы очень настаивали на том, чтобы заставить это работать, вы могли бы воспользоваться знанием того, что встроенное контекстное меню - это просто стандартное всплывающее меню Win32, которое отображается всеми общими элементы управления, и эти элементы управления отправляют их родителю WM_INITMENUPOPUP сообщение, когда всплывающее меню собирается стать активным.

Вооружившись этими знаниями, вы можете решить вызвать P/Invoke некоторых функций из Windows API и изменить это контекстное меню. В частности, AppendMenu или же SetMenuIteminfo функции.

Но тогда вас ждет сюрприз. Оказывается, что родной элемент управления Edit (который TextBox является представителем) не отправляет WM_INITMENUPOPUP сообщение! Я не уверен насчет TreeView контроль, а DataGridView control не будет ничего делать, потому что это собственный класс, написанный для WinForms. Он вообще не основан ни на одном из собственных элементов управления Win32, поэтому он не будет отправлять такие сообщения, которые вы можете обработать.

Другие вопросы по тегам