У меня есть два события щелчка по пунктам меню в ContextMenuStrip.
Я могу получить SourceControl для выбранного пункта контекстного меню, выполнив этот код:
Control c = ((sender as ToolStripItem).Owner as ContextMenuStrip).SourceControl;
Но когда я использую этот код в пункте контекстного меню на другом уровне, он возвращает значение null.
Как я могу получить SourceControl в событии щелчка пункта меню второго снимка экрана?
Насколько мне известно, это ошибка в ContextMenuStrip, которая существует с самого начала. Вы в основном должны делать то, что предложил @Jimi. Вы, вероятно, могли бы унаследовать ContextMenuStrip и сделать это внутренне, если захотите, но, если это одноразовый, поле - самый простой вариант.





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;
}
Извините за вопрос, но как я могу получить цвет, противоположный цвету? Когда у меня белый, черный наоборот и так далее ...
Color OppositeColor = Color.FromArgb(Color.White.ToArgb() ^ 0xffffff); Упрощенное. Противоположный цвет зависит от цвета домен. Это может быть намного сложнее рассчитать, в зависимости от пункта назначения.
Вероятно, проще иметь Поле (что-то вроде
Control CurrentContextMenuOwner), которое устанавливается при открытииContextMenu. Подпишитесь на событиеOpened()и установитеCurrentContextMenuOwner = (sender as ContextMenuStrip).SourceControl;. Затем в любом изToolStripMenuItemsвы можете использовать ссылкуCurrentContextMenuOwnerдля доступа к свойствам элемента управления. Установите дляCurrentContextMenuOwnerзначение null в событияхClosing()илиClosed()ContextMenu.