0

可能重复:
如何修复用户控件中的闪烁

我目前正在开发一个程序,该程序可以为表单的背景图像动态加载图像。一旦图像完全应用于背景,我希望表单可见。

我已经尝试过表单事件BackgroundImageChanged,但这没有用。

如果图像是高分辨率的,我可以看到表格出现并且图像仍在自行构建。

代码片段:

this.backgroundImage = loadedImage;
// Thread.Sleep(5000);
this.Show();

正如您所看到的,我正在使用Thread.Sleep()一些时间来在显示表单之前完全加载图像。但是有没有这样的方法:

this.backgroundImage = loadedImage;
while( imageIsNotFullyLoaded() ) { }
this.Show();

或者有没有其他方法或事件我还没有见过?

编辑:

我的代码:

forn1.cs :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace GameClient {
    public partial class FormMain:Form {
        getImage _getImage;
        public FormMain() {
            InitializeComponent();
        }

        private void FormMain_Load( object sender, EventArgs e ) {
            _getImage = new getImage();
            Image  splashLogo = _getImage.fromURL( "http://ace-acid.no-ip.org/GameClient/splash.png" );
            this.BackgroundImage = splashLogo;
            Thread.Sleep(3000);
            this.Show();
        }

        private void btnLogin_Click( object sender, EventArgs e ) {

            this.Hide();
        }
    }
}

获取图像.cs:

using System;
using System.Drawing;
using System.IO;
using System.Net;

namespace GameClient {
    class getImage {
        public Image fromURL( string URL ) {
            Image tmpImg = null;
            try {
                HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create( URL );
                request.AllowWriteStreamBuffering = true;
                request.Timeout = 20000;
                WebResponse response = request.GetResponse();
                Stream stream = response.GetResponseStream();
                tmpImg = Image.FromStream( stream );
                response.Close();
            } catch( Exception ex) {
                return null;
            }
            return tmpImg;
        }
    }
}
4

2 回答 2

0

没有办法做到这一点。表单的实际失效/绘制是通过对非托管代码的互操作调用执行的,完成时没有回调或挂钩。您将不得不接受当前的程序。

如果您希望它至少是非阻塞的,那么根据您的 .NET 目标,您可以使用await Task.Delay(5000)(或等效的东西)。

于 2012-10-29T21:45:57.027 回答
0

你可以做一个简单的事情,比如调用委托,如果委托调用的方法有返回值,线程会等待它完成,所以你可以试试这个代码:

        delegate Image getImageDelegate(string url);
        private void Form1_Load(object sender, EventArgs e)
        {
            _getImage = new getImage();
Image splashLogo = (Image)this.Invoke(new getImageDelegate(_getImage.fromURL), new object[] { "http://ace-acid.no-ip.org/GameClient/splash.png" });
            this.BackgroundImage = splashLogo;
            this.Show();

        }
于 2012-10-29T21:55:24.617 回答