问题描述
我有一个带有 NotifyIcon 的 .NET 应用程序,它位于系统托盘中。该 nic 有一个 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_" & Account).First
mnu.ToolTipText = dt.Rows(0)("display")
我尝试在 ctx mnu(以及其他一些随机的东西)上循环 ShowItemToolTips,但没有任何改变这种行为。我要么需要解决这个问题,要么找到 ToolStripMenuItem.ToolTipText 的一些简单替代方法。
解决方法
好吧,我在中途想通了这一点,但我想我会把它发布给遇到这种行为的其他人。无论我尝试什么,ToolTipText 都不可行,但我能够将 ToolTip 控件添加到主窗体并劫持它。我将 ContextMenu 的 ShowItemToolTips 设置为 False 并手动处理 ToolTipText 文本的显示。
不能将 ToolTip 控件与 ToolStripMenuItem 一起使用(因为后者不是控件),但是您可以将它与 ContextMenuStrip 一起使用,后者是 mnu itms 的父控件。因此,我为每个 ToolStripMenuItem 的 MouseEnter 和 MouseLeave 事件添加了处理程序,并使用它们来显示/隐藏每个 mnu 项目的 ToolTipText。这在很大程度上消除了弹出窗口问题。仍然偶尔会出现奇怪的行为,但这是一个可行的解决方案。
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