Всплывающий текст подсказки под элементом управления

#c# #vb.net #tooltip #contextmenustrip

#c# #vb.net #всплывающая подсказка #contextmenustrip

Вопрос:

У меня есть приложение .NET с NotifyIcon, которое находится в системном трее. У этой сетевой карты есть ContextMenuStrip, а в ctx mnu есть несколько ToolStripMenuItems. Большинство из них имеют свой ToolTipText, установленный во время выполнения. Проблема в том, что большую часть времени ttp появляется ПОД элементом mnu. Он будет либо в основном, либо полностью скрыт самим элементом mnu. В зависимости от того, куда я перемещаю мышь, иногда ttp появляется над mnu, и вы можете видеть его полностью, но в большинстве случаев это не так.

Как вообще возможно, чтобы ttp появлялся под его контролем (что делает его бесполезным), мне непонятно, но кто-нибудь знает, как остановить это поведение?

Вот код, который его устанавливает. Довольно прямолинейно:

 Dim mnu As ToolStripMenuItem = ctmMain.Items.OfType(Of ToolStripMenuItem).Where(Function(m) m.Tag IsNot Nothing AndAlso m.Tag = "EM_" amp; Account).First
mnu.ToolTipText = dt.Rows(0)("Display")
 

Я пробовал задействовать ShowItemToolTips в ctx mnu (и несколько других случайных вещей), но это поведение ничего не меняет. Мне либо нужно это исправить, либо найти какую-нибудь простую альтернативу ToolStripMenuItem.Текст ToolTipText.

Ответ №1:

Ну, я понял это на полпути, но решил опубликовать это для всех, кто столкнется с таким поведением. ToolTipText был нежизнеспособным, что бы я ни пробовал, но я смог добавить элемент управления всплывающей подсказкой в основную форму и перехватить его. Я установил для ShowItemToolTips контекстного меню значение False и обработал отображение текста ToolTipText вручную.

Вы не можете использовать элемент управления ToolStripMenuItem с ToolStripMenuItem (поскольку последний не является элементом управления), однако вы можете использовать его с ContextMenuStrip , который является родительским элементом управления mnu itms. Итак, я добавил обработчики для событий MouseEnter и MouseLeave каждого ToolStripMenuItem и использовал их для отображения / скрытия текста ToolTipText для каждого элемента mnu. Это по большей части избавило от всплывающей проблемы. Все еще иногда возникают странные ситуации, но это жизнеспособное решение.

 Sub LoadMenus(acct As ToolStripMenuItem)
    AddHandler acct.MouseEnter, AddressOf EMToolTipShow
    AddHandler acct.MouseLeave, AddressOf EMToolTipHide
End Sub
Private Sub EMToolTipShow(sender As Object, e As EventArgs)
    ttpEM.Show(sender.ToolTipText, sender.GetCurrentParent())
End Sub
Private Sub EMToolTipHide(sender As Object, e As EventArgs)
    ttpEM.Hide(sender.GetCurrentParent())
End Sub