无法以编程方式更新PictureBox图像

时间:2015-11-10 18:56:28

标签: c# winforms picturebox

我有一个C#winform程序循环遍历图像,进行一些处理等。在处理时,我希望用户看到程序所在的图像。我在我的程序中添加了一个图片框,我正在使用这段代码:

pbIDImage.ImageLocation = filepath;

如果我在表单构造函数中放入这段确切的代码(用硬编码的文件路径来测试),它会显示图像。但是如果我把它放在我实际需要的图像处理循环中,那么图片框就不会显示图像。为什么它会在构造函数中工作,而不是在程序的不同方法中工作?

知道为什么吗?

4 个答案:

答案 0 :(得分:2)

您可以使用PictureBox.Load Method。如文档中所述,要么设置ImageLocation然后调用pictureBoX.Load(),要么直接使用接受图像位置的重载,例如pictureBox.Load(image_location);

请注意,此行为由PictureBox.WaitOnLoad Property控制,默认情况下为false。另一种方法是将该属性设置为true,然后仅使用pictureBiox.ImageLocation = ...。如你所见,你有很多选择。

答案 1 :(得分:1)

可能主要问题在于循环。

如果路径正常,图像将加载,但没有足够的时间进行渲染,或者UI线程太忙而无法反映更改。

作为证据,您可能会看到最后一张图片已加载到图片框中。

作为一种解决方法,您可以在循环中使用此代码(我不推荐,仅用于测试)

pbIDImage.ImageLocation = filepath;
pbIDImage.Refresh();
Application.DoEvents();

但总的来说,我认为您不需要在循环中更改图像时显示图像,或者如果更改不是太快,您可以使用背景工作者或基于任务的解决方案来设置图像。 / p>

答案 2 :(得分:0)

只有当imagebox第一次加载整个控件时,才会访问构造函数中的位置变量。

这意味着您可以在创建图像框后生成变量后更改代码,但这样就不会强制它加载图像。

您可以下载图像并保存到变量中。然后图像可以控制。

答案 3 :(得分:0)

循环导致UI实际冻结。我实现了一个后台工作器,然后按预期加载图像 - 使用picturebox.ImageLocation()。这就是为什么在构造函数中它加载正常(循环没有启动,UI是免费的)然后当循环开始时,图像无法在处理过程中加载。