我有一个带有多个窗体的vb.NET应用程序。(这个问题适用于任何.NET项目)目前许多应用程序的窗体上都有PictureBox控件。我希望此控件的行为标准化,因此我创建了一个带有setter、选项和事件的自定义类。
以前每个表单都有自己的ToolTip对象来显示下载的图像,但我不想在每个表单上重新定义它-所以我在控件中将imageToolTip定义为全局变量,并在OnHandleCreated方法中创建它并设置处理程序。
但它们从不触发。
Public Class ItemPreviewBox
Inherits PictureBox
Private imageToolTip As ToolTip
Private _ItemType, _ItemNum As String
Private _ColorID As Integer
Private _Thumb As Boolean
Private _Label As Label = New Label
Protected Overrides Sub OnHandleCreated(e As EventArgs)
MyBase.OnHandleCreated(e)
imageToolTip = New ToolTip With {
.OwnerDraw = True
}
imageToolTip.SetToolTip(Me, "")
SizeMode = PictureBoxSizeMode.Zoom
Cursor = Cursors.Hand
AddHandler imageToolTip.Popup, AddressOf HandlePopup
AddHandler imageToolTip.Draw, AddressOf HandleDraw
AddHandler Click, AddressOf HandleClick
End Sub
Private Sub HandlePopup(sender As ToolTip, e As PopupEventArgs)
Log("Tooltip Popped Up")
If _ItemType Is Nothing Then e.Cancel = True
e.ToolTipSize = New Size(250, 200)
End Sub
Private Sub HandleDraw(sender As ToolTip, e As DrawToolTipEventArgs)
If _ItemType Is Nothing Then Exit Sub
LogVerbose("opening image tooltip")
e.Graphics.Clear(SystemColors.Info)
Dim imgFileName = CacheImage(_ItemType, _ItemNum, _ColorID, _Thumb) 'Returns a string
Log($"{e.AssociatedControl.Name} - {e.AssociatedControl.Location.X},{e.AssociatedControl.Location.Y} top={e.AssociatedControl.Top} left=top={e.AssociatedControl.Left}")
e.Graphics.DrawImage(Image.FromFile(imgFileName), New Rectangle(0, 0, 250, 200))
End Sub
Click事件(与工具提示无关)会触发。
我也尝试过将工具提示代码移到所属窗体的Shown事件中(用控件的名称替换“Me”),它工作得很好。
工具提示是否需要将窗体而不是控件作为其父级?当自定义PictureBox为时,是否有任何方法可以示例化自定义工具提示?
1条答案
按热度按时间inb24sb21#
我在ToolTip的文档中找不到这一点,但根据CodeProject上的一篇文章:
动态设定控件的工具提示需要快显事件,但如果以空字串参数呼叫SetToolTip,控件的快显事件将会停止。(https://www.codeproject.com/Tips/59501/Implementing-Dynamic-ToolTips-Preventing-SetToolTi)
我设置了一个空字符串,因为我只打算显示一个图像,否则效率会很低。将SetToolTip行更改为
解决了问题。