Предотвращение закрытия контекстного меню ToolStripMenuItem при щелчке - PullRequest
4 голосов
/ 26 июля 2011

Я пытаюсь, чтобы мое контекстное меню оставалось на экране даже после того, как я щелкнул один из его выпадающих пунктов (когда нажата клавиша Shift, хотя я не думаю, что это имеет значение для проблемы).Вы можете увидеть пример поведения в Windows XP, нажав «Пуск»> «Все программы»> «Стандартные»> [теперь нажмите клавишу Shift] и щелкнув «Проводник Windows» ... Меню остается активным.

ЭтоПриложение C #, использующее Winforms, машина разработки - Windows 7, рабочая версия - XP, Vista или 7.

У toolstripmenuitem, похоже, нет события closing;только closed один.Те, кто знаком с событием closing, будут знать, что вы можете установить флаг cancel, чтобы предотвратить закрытие элемента управления.

Кроме того, когда я пытаюсь обойти его переделку, видимую изнутри либо его clickсобытие или его closed событие, оно не работает.Хотя это было бы приемлемым решением в ближайшем будущем, оно не для производства.

Любые предложения или связанная с этим информация с благодарностью приветствуются.

Спасибо

Ответы [ 3 ]

5 голосов
/ 08 августа 2011

Мне удалось создать динамически создаваемое подменю моего ContextMenu, оставаясь на экране после нажатия на него, установив для свойства AutoClose его меню Parent DropDown значение «False», например:

ParentMenu.DropDown.AutoClose = false;

, где ParentMenu - этоa ToolStripMenuItem.

Использование события Closing родительского элемента DropDown ToolStripDropDownMenu для достижения этого путем установки флага «Отмена» не было жизнеспособным решением, поскольку оно вызывало нестабильное отображение / скрытие в любом изего 2 уровня родительского меню, а также вызывающие неожиданные визуальные артефакты на экране, от которых я не мог избавиться, когда позже был скрыт через код.Казалось также, что некоторые события динамически создаваемого меню Parents больше не запускаются, например, событие MouseEnter.

Интересная находка во время этого опыта состояла в том, что, хотя IntelliSense в Visual Studio 2010 перечисляет LostFocusсобытие для DropDown пункта контекстного меню;при добавлении этого события в динамически создаваемые меню оно не срабатывает;это, по-видимому, известное поведение, упомянутое здесь :

4 голосов
/ 18 февраля 2012

Вот что я в итоге использовал.При использовании этого метода автоматическое закрытие раскрывающегося списка отключается только тогда, когда указатель мыши находится на раскрывающемся элементе управления.MyMenuItem это тип ToolStripMenuItem.

AddHandler MyMenuItem.DropDown.MouseEnter, AddressOf DisableDropMenuClose
AddHandler MyMenuItem.DropDown.MouseLeave, AddressOf EnableDropMenuClose

Private Sub DisableDropMenuClose(ByVal sender As System.Object, ByVal e As System.EventArgs)
    CType(sender, ToolStripDropDownMenu).AutoClose = False
End Sub

Private Sub EnableDropMenuClose(ByVal sender As System.Object, ByVal e As System.EventArgs)
    CType(sender, ToolStripDropDownMenu).AutoClose = True
End Sub
1 голос
/ 01 августа 2011

ToolStripDropDownMenu имеет событие закрытия.

private void MyContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e) {
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) {
        e.Cancel = true;
    }
}
...