动态更改图片框中的图像无法正常工作

时间:2016-05-12 21:12:36

标签: vb.net image visual-studio-2010 picturebox

我一直在试图解决这个问题几个星期。

在我的VB 2010 Forms应用程序中,我有许多图片框,使用拖放方法填充其他图片框中的图像。这没问题,工作正常。图片框都在一个groupbox容器中。

问题是尝试在拖放操作中在两个图片框之间交换图像。换句话说,pBox1有image.x,pBox2有image.y。将图像从pBox2拖到pBox1,然后将其删除; pBox1将从pBox2获得image.y,pBox2将从pBox1获得image.x.

通过这个例子,这是我到目前为止的代码:

Private Sub pBox2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pBox1.MouseDown
     strImageSource = "pBox2" 'strImageSource is a global string variable
     [other stuff]
 end sub

^这会将源图片框的名称保存为全局字符串。

Private Sub pBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles pBox1.DragDrop
    For Each Control as PictureBox in GroupBox1.Controls.OfType(of PictureBox)()
     if Control.Name = strImageSource then
       Control.Image = pBox1.Image
     end if
   next

   dim imgTarget as Image = CType((e.Data.GetData(DataFormats.Bitmap)), Bitmap)
   pBox1.image = imgTarget
 End Sub

^这将搜索由strImageSource(“pBox2”)命名的图片框,并将pBox1的内容复制到其中,然后将pBox2中的图像放入pBox1。

我希望这是有道理的。

这正确地将图像从pBox2放入pBox1,但它不会将图像从pBox1切换到pBox2。 pBox2只是空白。但是,调试显示pBox2中的图像并非一无所获;它确实包含一个位图。它只是不可见。

现在,就像测试一样,我在For Each部分添加了一行来改变图片框的背景颜色:

 For Each Control as PictureBox in GroupBox1.Controls.OfType(of PictureBox)()
   if Control.Name = strImageSource then
     Control.Image = pBox1.Image
     Control.BackColor = color.red
   end if
next

背面的颜色确实发生了变化。这告诉我For Each部分正在工作 - 它正在找到控件并改变背面颜色。它只是没有显示图像。

我有什么东西可以忽略吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

您应该在PictureBox控件上调用Control.Refresh()以更新图像。

答案 1 :(得分:0)

使用定义为Picturebox的全局变量

,而不是使用strImageSource

Private tmpPictureBox As PictureBox

然后存储该图片框参考,以便您可以在DragDrop上设置其图像

Private Sub pBox2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pBox1.MouseDown
     'store the picturebox reference
     tmpPictureBox = sender
     [other stuff]
 end sub

Private Sub pBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles pBox1.DragDrop
   'set the first image to the second
   tmpPictureBox.Image = sender.image

   'set the second image to the first
   pBox1.image = CType((e.Data.GetData(DataFormats.Bitmap)), Bitmap)
 End Sub

答案 2 :(得分:0)

好的,这很愚蠢。

我正在做一切正确的事情,一个真正的愚蠢的例外。在代码的另一部分,莫名其妙地,我在更换图像后清除了内容的图片框。它可能是我试图做的与此问题无关的遗留物,我从来没有纠正过它。

我为此道歉,并感谢所有回复。