【问题标题】:Force unseen PictureBox to load image强制看不见的 PictureBox 加载图像
【发布时间】:2013-05-20 09:19:52
【问题描述】:

我有一个表格,上面排列着许多 PictureBox,但并非所有图片都同时显示在表格上(表格上有滚动条可以显示看不见的 PictureBox)。他们的图像位置是互联网 URL。我想在加载每个图像后立即将这些图像保存在本地,因此我挂钩到那些 PictureBox 的 ContentLoaded 事件。

问题是看不见的 PictureBox 不加载图像,因此无法保存它们的图像,直到滚动表单使其可见。但我不能指望用户会一直滚动表单的全部内容。

有没有办法强制看不见的 PictureBox 加载它的图像?

谢谢。

编辑:

您好,DmitryG,问题可能是我的 PictureBoxes LoadAsync 在加载真实内容之前“加载图像”。在您的代码中,如果您添加

        pb.ImageLocation = "http://images.google.com.vn/intl/en_ALL/images/logos/images_logo_lg.gif";

        pb.LoadAsync();

在循环之前

        pb.ImageLocation ="https://www.google.com/images/srpr/logo4w.png";
        pb.LoadAsync();

然后加载表单,你只会看到 7 个消息框而不是 10 个。这是因为隐藏了 3 个图片框。

【问题讨论】:

  • 只需使用 Image 属性来分配“等待加载”图像。使用资源中的一个。

标签: c# picturebox


【解决方案1】:

您可以通过调用PictureBox.LoadAsync 方法来执行图像加载,尽管图片框可见。当图像加载完成时,PictureBox.LoadCompleted 将被提升:

pictureBox1.LoadCompleted += pictureBox1_LoadCompleted;

pictureBox1.InitialImage = Image.FromFile(@"... path to waiting-to-load image ...");

pictureBox1.ImageLocation = <...path to image...>;
pictureBox1.LoadAsync(); // perform loading

void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e) {
    // do something with loaded image
}

更新:自动滚动面板和 5 个图片框的示例代码。

panel1.AutoScroll = true;
panel1.Height = 1000;
for(int i = 0; i < 5; i++) {
    PictureBox pb = new PictureBox();
    pb.Dock = DockStyle.Top;
    pb.Height = panel1.Height/2;
    pb.WaitOnLoad = false;
    pb.InitialImage = Image.FromFile("WaitingToLoad.gif");
    pb.ImageLocation = @"https://www.google.com/images/srpr/logo4w.png";
    pb.LoadCompleted += pb_LoadCompleted;

    pb.Parent = panel1;
    pb.LoadAsync(); //<<<<<
}
//
void pb_LoadCompleted(object sender, AsyncCompletedEventArgs e) {
    MessageBox.Show("Load completed!");
}

【讨论】:

  • 感谢您的快速回复,但您误解了我的问题。我的代码与您的相似(我设置了 WaitOnLoad=false,并进行了一些修改以在加载实际内容时添加“加载图像”)。使用此代码,我希望 PictureBox 从其 Internet URL 加载图像,尽管它具有可见性,但事实并非如此。
  • @user2345529 这段代码对我来说很好用(我已经将图片框放在不可见的标签页上,甚至设置了pictureBox1.Visible=false 以确保可见性根本不会影响图像加载)。
  • 你好,DmitryG,我已经这样测试过了。我将 5 个图片框放在一个面板中,调整面板的大小以仅适合 2 个,并将面板 AutoScroll 设置为 true。然后我动态地(在代码中)将所有 PictureBoxes 的 URL 设置为图像的 Internet URL。结果是三个看不见的 PictureBox 将不会加载它们的图像,直到我滚动面板使它们可见。如果我设置pictureBox1.Visible=false 也是一样,然后通过一个按钮打开它的Visble。您是否将 PictureBox 图像位置设置为 Internet URL,而不是本地路径?
  • 是的,我正在使用 ImageLocation 的网址 (https://www.google.com/images/srpr/logo4w.png)。稍后我会尝试测试您的方案并通知您我的结果。
  • 我已经用 autoscroll-panel 检查了我的代码 a 5 个图片框 - pictureBox.LoadAsync() 方法调用使所有 5 个图像都显式加载。查看更新的答案。
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多