当鼠标悬停在另一个控件上时,我打算在我的表单中显示PictureBox。然后我想在鼠标离开控件时使用单独的事件。此事件将从控件中删除显示的PictureBox。但是,因为我的事件是私有子,我不能在后一个事件中直接访问控件的名称。对此的解决方案是删除最近添加的控件的方法。如果不存在这样的方法,或者有另一种方法来解决这个问题,我们将不胜感激。
我试过简单地使用Controls.Remove(),但这需要一个参数。作为字符串的控件名称也不起作用,因为参数必须是控件本身。
Private Sub Tile_MouseEnter(Sender As Object, e As EventArgs)
Dim CloseUpPic As New PictureBox With {Properties}
CloseUpPic.Image = Sender.Image
Controls.Add(CloseUpPic)
Refresh()
End Sub
Private Sub Tile_MouseLeave(Sender As Object, e As EventArgs)
Me.Controls.Remove()
End Sub
由于.Remove()需要参数,程序将无法编译
我希望在鼠标进入磁贴时创建和显示Control,并在鼠标离开磁贴时停止存在。
为了将来参考,控件具有Tag属性,允许您存储任何您喜欢的内容。在这种情况下,您可以存储对新创建的PictureBox的引用。此外,“Sender”参数告诉您哪个控件是事件的来源。您可以将发件人强制转换为控件,然后存储引用。然后,在leave事件中,您可以将发送者强制转换为控件,将.Tag强制转换为控件,最后将其删除:
Private Sub Tile_MouseEnter(Sender As Object, e As EventArgs)
Dim ctl As Control = DirectCast(Sender, Control)
Dim CloseUpPic As New PictureBox With {Properties}
CloseUpPic.Image = Sender.Image
Controls.Add(CloseUpPic)
ctl.Tag = CloseUpPic
Refresh()
End Sub
Private Sub Tile_MouseLeave(Sender As Object, e As EventArgs)
Dim ctl As Control = DirectCast(Sender, Control)
Dim ctlToRemove As Control = DirectCast(ctl.Tag, Control)
Me.Controls.Remove(ctlToRemove)
End Sub
我最终使用以下代码来解决我的问题:
For Each Closeup In Controls.OfType(Of CloseUp)
Controls.Remove(Closeup)
Next
我创建了一个名为Closeup的新类,它继承了PictureBox。然后我在控件中循环每个特写(只有一个,但这个代码适用于多个控件),并删除它们。