Подсказка пункта меню скрыта подменю раскрывающегося списка - PullRequest
2 голосов
/ 14 февраля 2011

У меня есть winforms ContextMenuStrip, для которого установлен ToolTipText для всех его ToolStripMenuItem.

Один из этих пунктов меню, «Вставить действие», имеет соответствующее подменю ToolStripDropDown. Когда мышь перемещается в режим «Вставить действие», автоматически отображается раскрывающееся меню и отображается всплывающая подсказка, связанная с «Вставить действие», но она перемещается на фон позади и ContextMenuStrip, и раскрывающегося списка.

Смотрите картину проблемы: http://www.screencast.com/t/GZkeBNcU

Я попытался программно повторно выбрать «Вставить действие» после открытия подменю, но подсказка не будет отображаться сверху.

Есть идеи?

В качестве альтернативы, есть ли способ отображать подменю «Вставить действие» только при нажатии на него (в отличие от автоматического при наведении на него мыши)? Я бы подумал, что для этого должна быть настройка, но я не смог ее найти.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 17 февраля 2011

Хорошо, это не очень элегантно, так что терпите меня.

Кажется, что ToolTipText изначально рисуется сверху, но как только при следующей загрузке ToolStripMenuItems (те, что были вызваны "Insert Action" в вашем случае), оба набора MenuStrips оказываются выше ToolTipText. Итак, моя мотивация состояла в том, чтобы заставить ToolTipText появляться ПОСЛЕ новой загрузки MenuStrip.

Итак, сначала я добавил обработчик DropDownOpened в myToolStripMenuItem, который будет таким, какой вы назвали ваш «Вставить действие ...» MenuItem.

Затем я добавил следующий код

private void myToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
{
    myToolStripMenuItem.Visible = false;
    myToolStripMenuItem.Visible = true;
    myToolStripMenuItem.ToolTipText = "Tooltip info that you want to see!";
}

То, что это делает, ждет загрузки подменю, переключает видимость myToolStripMenuItem (который является уродливой частью всего этого) и сбрасывает ToolTipText, заставляя его отображаться после того, как все загружено, а также в верхней части все.

Однако, если оставить это так, это приведет к некоторому миганию текста, если вы попытаетесь парить и уходить дважды или более. Попробуйте с этим кодом, и вы поймете, что я имею в виду. Итак, вы должны сбросить ToolTipText в пустую строку. Я сделал это, когда сработало событие DropDownClosed для того же MenuItem.

private void myToolStripMenuItem_DropDownClosed(object sender, EventArgs e)
{
    myToolStripMenuItem.ToolTipText = "";
}

Теперь, ToolTipText появляется точно, когда и где мы хотим, чтобы он появлялся без каких-либо мерцаний.

ПРИМЕЧАНИЕ: Этот метод приведет к тому, что ToolTipText будет отображаться немного дольше, чем обычно. Это, конечно, потому что код ожидает загрузки выпадающего меню. Кроме того, переключение myToolStripMenuItem.Visible иногда вызывает мерцание в меню. Тем не менее, я чувствую, что это гораздо лучше, чем показывать всплывающую подсказку, которую вы не можете видеть.

...