VB.NET如何检查我的资源中的图像是否加载到PictureBox中?

时间:2016-08-27 15:55:04

标签: vb.net

我正在尝试使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".

2 个答案:

答案 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”原则)。