C# Windows窗体-等待窗体完全绘制(绘制)
我设计了一个forwich,唯一的目标是运行一个方法。 这是一张C# Windows窗体-等待窗体完全绘制(绘制),c#,winforms,paint,showdialog,C#,Winforms,Paint,Showdialog,我设计了一个forwich,唯一的目标是运行一个方法。 这是一张表格,请稍候 我给它一个委托,然后调用ShowDialog。 它只接受该委托并在所示的事件中执行它。然后,Hide() 其目的仅仅是告诉用户等待代理运行 但是:它在完全显示之前就开始执行委托。我的意思是,表单出现在屏幕上,但是请稍候标签被正在运行的代码卡住,显示得很晚,甚至没有显示。(一个空矩形保留在窗体的中间)。 我可以让表单在运行委托之前等待大约两秒钟,但是有没有其他方法(更好、更可靠)在表单完全绘制并显示标签后调用委托 谢谢。
表格,请稍候
我给它一个委托,然后调用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线程中运行,并且在执行时不会挂断“表单”出现在屏幕上,但是“等待”标签被运行代码卡住,显示得很晚,甚至没有显示。(空矩形保留在窗体的中间)。“听起来,您需要在单独的线程中执行委托,以便表单能够正确地显示和更新自己。请调用此。Update())在运行委托之前。@Idle\u注意,单独的线程会变慢吗???这是繁重的主代码。你可以像Hans建议的那样调用Update(),甚至可能需要在其中添加一些Application.DoEvents(),以允许表单刷新自己……但是如果进程“繁重”到足以阻止表单更新,那么处理它的“正确”方法是使用后台线程。如果你想要一个更好的答案,那么给我们看一些代码。代码就是:显示的表单调用委托和隐藏。“表单出现在屏幕上,但请等待”标签被运行代码卡住,显示得很晚,甚至没有显示。(一个空矩形保留在窗体的中间)。“听起来,您需要在单独的线程中执行委托,以便表单能够正确地显示和更新自己。请调用此。Update())在运行委托之前。@Idle\u注意,单独的线程会变慢吗???这是繁重的主代码。你可以像Hans建议的那样调用Update(),甚至可能需要在其中添加一些Application.DoEvents(),以允许表单刷新自己……但是如果进程“繁重”到足以阻止表单更新,那么处理它的“正确”方法是使用后台线程。如果你想要一个更好的答案,那么给我们看一些代码。代码就是:显示的表单调用委托和隐藏。两行。