C# Windows窗体-等待窗体完全绘制(绘制)

C# Windows窗体-等待窗体完全绘制(绘制),c#,winforms,paint,showdialog,C#,Winforms,Paint,Showdialog,我设计了一个forwich,唯一的目标是运行一个方法。 这是一张表格,请稍候 我给它一个委托,然后调用ShowDialog。 它只接受该委托并在所示的事件中执行它。然后,Hide() 其目的仅仅是告诉用户等待代理运行 但是:它在完全显示之前就开始执行委托。我的意思是,表单出现在屏幕上,但是请稍候标签被正在运行的代码卡住,显示得很晚,甚至没有显示。(一个空矩形保留在窗体的中间)。 我可以让表单在运行委托之前等待大约两秒钟,但是有没有其他方法(更好、更可靠)在表单完全绘制并显示标签后调用委托 谢谢。

我设计了一个forwich,唯一的目标是运行一个方法。 这是一张
表格,请稍候

我给它一个委托,然后调用
ShowDialog
。 它只接受该委托并在所示的
事件中执行它。然后,
Hide()

其目的仅仅是告诉用户等待代理运行


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

我可以让表单在运行委托之前等待大约两秒钟,但是有没有其他方法(更好、更可靠)在表单完全绘制并显示标签后调用委托

谢谢。

尝试使用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线程中运行,并且在执行时不会挂断

请尝试使用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线程中运行,并且在执行时不会挂断