#c# #winforms #user-interface #controls
#c# #winforms #пользовательский интерфейс #элементы управления
Вопрос:
Распространенным шаблоном пользовательского интерфейса является отображение текста в строке состояния, связанного с текущим выбранным пунктом меню.
В прошлом я достиг этого в winforms, создав поставщика расширителя, который добавляет свойство string с пользовательским текстом для каждого пункта меню, отображаемого в строке состояния. Это было достигнуто путем добавления обработчиков событий к событиям MenuStrips MouseEnter и MouseLeave для отображения и удаления текста.
Проблема, с которой я сталкиваюсь, заключается в том, что теперь я использую элемент управления MainMenu вместо MenuStrip, и поскольку он не является производным от элемента управления, у него нет событий MouseEnter и MouseLeave.
В MainMenu есть событие Click, которое означает, что я могу отобразить свой текст в строке состояния, но, насколько я вижу, нет способа определить, когда мышь покинула пункт меню, и удалить текст из строки состояния.
Мой вопрос в том, как я могу реализовать этот шаблон пользовательского интерфейса, используя элемент управления MainMenu? В частности, я хотел бы знать, как определить, когда мышь покинула пункт меню, чтобы текст можно было удалить из строки состояния.
Примечание: Элемент управления MenuStrip не подходит, поскольку он не использует внешний вид операционной системы, и я пытаюсь максимально приспособить свое приложение к этому.
Ответ №1:
У каждого элемента меню есть событие Select. Подключитесь к нему и соответствующим образом измените текст вашего статуса.
Ну, что касается обнаружения выхода из пункта, используйте таймер, запомните Rect
последний введенный MenuItem
, затем, когда (проверьте по событию таймера) он погаснет, отмените текст. Не очень красиво, но может сработать.
Комментарии:
1. Я делаю это, и это работает нормально. Проблема заключается в удалении текста после того, как мышь отошла от пункта меню. Возможно, мне следует перефразировать свой вопрос, чтобы сделать его более понятным.
2. Спасибо за предложение — я не уверен, как получить прямую ссылку на MenuItem, но посмотрю. Даже если это невозможно, я мог бы просто удалить текст с помощью таймера по истечении определенного количества времени.
3. @Benjamin — Я думаю, здесь вам придется копать глубже — переопределите onDraw, захватите прямоугольник там и так далее. Я думаю, много работы для простой вещи. : (
4. Да, кажется, что это большая работа по сравнению с работой с MenuStrip. Я задаюсь вопросом, насколько мне действительно нужна эта функция сейчас, поскольку я думаю, что мои усилия будут лучше потрачены в другом месте. Ваш ответ действительно касается моего вопроса, поэтому я принял его как ответ. Спасибо за вашу помощь.