我正在尝试使PictureBox在按下时更改图像,如果再次按下它将更改为原始图像。我怎样才能做到这一点?这是我的代码。
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
If (PictureBox1.Image = WindowsApplication1.My.Resources.Resources.asd) Then
PictureBox1.Image = WindowsApplication1.My.Resources.Resources._stop()
Else
PictureBox1.Image = WindowsApplication1.My.Resources.Resources.asd()
End If
End Sub
当我运行它时,会出现以下错误:
Operator '=' is not defined for types "Image" and "Bitmap".
答案 0 :(得分:1)
嗯,这是一个很好的问题。 My.Resources属性getter中隐藏了一个大型的熊陷阱,每次使用它时都会得到一个 new 位图对象。这有很多后果,位图是非常昂贵的对象,调用它们的Dispose()方法对于防止程序内存不足非常重要。因为它是新对象,所以比较总是会失败。 Image和Bitmap之间的区别只是一个小问题。
仅使用一次位图对象至关重要。像这样:
Private asd As Image = My.Resources.asd
Private _stop As Image = My.Resources._stop
现在您可以正确编写此代码,因为您正在比较参考标识的对象:
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
If PictureBox1.Image = asd Then
PictureBox1.Image = _stop
Else
PictureBox1.Image = asd
End If
End Sub
就像一个优秀的程序员一样,当你不再使用它们时,你会处理它们:
Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
asd.Dispose()
_stop.Dispose()
End Sub
同时修复首先分配PictureBox1.Image属性的代码,我们无法看到它。
答案 1 :(得分:0)
您可以使用PictureBox的.Tag
属性来存储信息。为此,我将存储资源名称。
如果你有一个要使用的资源名称数组,你可以得到下一个(使用Mod
从最后一个回绕到第一个(第0个 - 数组索引从VB开始为零)。 NET)入口)。
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
Dim imageResourceNames = {"Image1", "Image2"}
Dim pb = DirectCast(sender, PictureBox)
Dim tag = CStr(pb.Tag)
pb.Image?.Dispose()
Dim nextImage = imageResourceNames((Array.IndexOf(imageResourceNames, tag) + 1) Mod imageResourceNames.Length)
pb.Image = DirectCast(My.Resources.ResourceManager.GetObject(nextImage), Image)
pb.Tag = nextImage
End Sub
请根据需要更改“Image1”和“Image2”。
如果搜索到的项不在数组中, Array.IndexOf
将返回-1,但我们正在向它添加1,因此如果{{1},它将获得数组的第一项(在索引0处)尚未设置。
如果您有第三张图片,只需将其名称添加到数组中即可。
行.Tag
处理图片使用的资源 - PictureBox1.Image?.Dispose()
只会在?
不是Nothing的情况下执行此操作。
首次设置PictureBox的图像时,请记住正确设置其PictureBox1.Image
属性,使其行为符合预期。
我使用了.Tag
,这样你就可以简单地复制并粘贴不同PictureBox的代码,并且代码中几乎没有变化 - 否则你将不得不更新对PictureBox1的引用它,这可能容易出错。当然,在那时你会开始考虑重构它,这样你就不会重复代码(“不要重复自己”,或者说“DRY”原则)。