Windows窗体 - 等到窗体完全绘制(绘制)

时间:2013-05-09 22:42:58

标签: c# winforms paint showdialog

我设计的目标是运行方法。 它是please wait形式。

我给了一位代表,并致电ShowDialog。 它只需要该委托并在Shown事件中执行它。之后,Hide()

目的只是告诉用户等到代表运行。

但是:它在完全显示之前开始执行代理。我的意思是,表单出现在屏幕上,但please wait标签被正在运行的代码卡住,显示得很晚,甚至没有显示。 (一个空的矩形保留在表格的中间)。

我可以在运行委托之前让表单等待两秒钟,但是在表单完全绘制之后是否有另一种方式(更好,更放心)调用委托,标签显示???

感谢。

1 个答案:

答案 0 :(得分:1)

尝试使用BackgroundWorker BackgroundWorker组件有4个事件。

您需要实现其中两个:DoWork和RunWorkerCompleted

DoWork方法在一个线程中执行,并且是您工作的地方(或者在您的情况下,调用您的委托) 工作完成后调用RunWorkerCompleted,您可以在那里调用Hide()方法。

如果你碰巧想要显示进度,你可以实现ProgressChanged事件,它允许你传递一个完成的百分比和一个对象(通常我传递一个关于我正在做的事情的消息)

然后像往常一样做你的绘图,并调用后台工作者RunWorkerAsync来调用它。

public class Wait : Form
{
    BackgroundWorker _bgWorker = new BackgroundWorker(); 
    public delegate void toExecuteDele(object args); 

    public toExecuteDele ToExecute; 

    public Wait()
    {
        InitializeComponent(); 
        _bgWorker.DoWork += new DoWorkEventHandler( DoWork )
        _bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (WorkDone); 
    }  

    public void Execute(object args)
    {
         // Display Stuff (label, start a progress bar pulsing, maybe enable disable stuff 
            DispalyStuff(" Plate Wait"); 
         _bgWorker.RunBackgroundAsync(args); 
    }

    private void DoWork(object sender, DoWorkEventArgs e)
    {

         if( ToExecute != null )
            ToExecute(e.Argument); 

    }  

    public void WorkDone(object sender, RunWorkerCompletedEventArgs e)
    {  
        // Display an Error if there is an exception in the event args 
        Hide(); 
    }
}

DoWork中的所有内容都发生在另一个线程中,其他所有内容都在UI线程中运行,并且在执行时不会挂断。

相关问题