Получить SourceControl для DropDownMenu

У меня есть два события щелчка по пунктам меню в ContextMenuStrip.
Я могу получить SourceControl для выбранного пункта контекстного меню, выполнив этот код:

Control c = ((sender as ToolStripItem).Owner as ContextMenuStrip).SourceControl;

Получить SourceControl для DropDownMenu

Но когда я использую этот код в пункте контекстного меню на другом уровне, он возвращает значение null.

Получить SourceControl для DropDownMenu

Как я могу получить SourceControl в событии щелчка пункта меню второго снимка экрана?

Вероятно, проще иметь Поле (что-то вроде Control CurrentContextMenuOwner), которое устанавливается при открытии ContextMenu. Подпишитесь на событие Opened() и установите CurrentContextMenuOwner = (sender as ContextMenuStrip).SourceControl;. Затем в любом из ToolStripMenuItems вы можете использовать ссылку CurrentContextMenuOwner для доступа к свойствам элемента управления. Установите для CurrentContextMenuOwner значение null в событиях Closing() или Closed()ContextMenu.

Jimi 12.11.2018 13:09

Насколько мне известно, это ошибка в ContextMenuStrip, которая существует с самого начала. Вы в основном должны делать то, что предложил @Jimi. Вы, вероятно, могли бы унаследовать ContextMenuStrip и сделать это внутренне, если захотите, но, если это одноразовый, поле - самый простой вариант.

jmcilhinney 12.11.2018 14:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
191
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ContextMenuStripУправления источником (ссылка на текущий элемент управления, в котором активировано контекстное меню) может быть получено из ToolStripMenuItem, проверяя ссылку OwnerItem и перемещаясь вверх по течению, пока ссылкой OwnerItem не станет null, затем проверив значение Владелец, которое ссылается на ContextMenuStrip.
(К сожалению, ссылка SourceControl доступна только в элементе управления ContextMenuStrip).

Простой альтернативный метод - использовать Field, который ссылается на Control, где текущий ContextMenuStrip был активирован (у вас может быть только один активный ContextMenuStrip) .
Эта ссылка на поле, устанавливаемая при открытии ContextMenuStrip - путем подписки на событие Opened() - может быть затем доступна любому из ToolStripMenuItem.
Ссылка поля затем возвращается к null, когда ContextMenuStrip закрывается.

▶ Удалите объект contextMenuOwner при закрытии формы.

Пример:
(toolStripMenuItem - общее имя, оно должно быть установлено как фактическое имя элемента управления).

Control contextMenuOwner = null;

private void toolStripMenuItem_Click(object sender, EventArgs e)
{
    contextMenuOwner?.BackColor = Color.Blue;
    //(...)
}

private void contextMenuStrip1_Opened(object sender, EventArgs e)
{
    contextMenuOwner = (sender as ContextMenuStrip).SourceControl;
}

private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
    contextMenuOwner = null;
}

Извините за вопрос, но как я могу получить цвет, противоположный цвету? Когда у меня белый, черный наоборот и так далее ...

GoldErzYT GoldErzYT 12.11.2018 17:24
Color OppositeColor = Color.FromArgb(Color.White.ToArgb() ^ 0xffffff); Упрощенное. Противоположный цвет зависит от цвета домен. Это может быть намного сложнее рассчитать, в зависимости от пункта назначения.
Jimi 12.11.2018 17:29

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