我需要能够在Windows窗体中轻松创建异步UI。我正在考虑创建自定义容器控件,允许在那里托管其他控件。然后,在运行应用程序时,除非填充/初始化其他控件,否则此控件将显示进度条。然后,完成工作后,将显示这些控件并隐藏进度条。
有任何建议如何实现这个?
答案 0 :(得分:2)
您可以使用Panel类作为起点。只是继承它。
您需要在面板顶部或作为其第一个成员加载进度条。如果您不想更新它,可以在进度条上使用Marquee样式;否则,您可以在向面板添加控件时增加进度条。
如果您使用Marquee样式,那么您已经完成了很多工作。如果你想要一个实际的进度条从0到100%填满,你将需要一些额外的幻想。
这是一个棘手的部分:UI组件更新必须在UI线程中运行。但是你无法在UI线程中运行所有内容,因为在完成添加控件之前,UI线程不会处理事件(例如更新进度条)。
您需要的是一种方法,该方法将负责将控件添加到Panel,以便您可以在发生时更新UI。有很多方法可以做到这一点;最简单的方法可以说是:
Thread thread = new Thread(MyControlAddingMethod);
thread.Start();
您的控件添加方法需要将UI方法调用封送到UI线程。方法如下:
void MyControlAddingMethod()
{
myPanel.BeginInvoke(m => { myPanel.Controls.Add(myControl); ++myProgressBar.Value;});
//or
myPanel.BeginInvoke(MyFunctionThatDoesTheSameAsTheLambdaStatementAbove);
}