Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当打开一个正在忙于创建其子控件的窗体时,如何显示正在加载的动画?_C#_Winforms - Fatal编程技术网

C# 当打开一个正在忙于创建其子控件的窗体时,如何显示正在加载的动画?

C# 当打开一个正在忙于创建其子控件的窗体时,如何显示正在加载的动画?,c#,winforms,C#,Winforms,我有以下情况,我有一个表单应用程序,需要加载很多UI控件。我有一个加载动画,它是在每一个其他控制。 我希望动画在加载过程中保持在上方并运行。 在过程结束时,带有动画的面板可能会消失 由于UI正忙于创建和定位每个新控件,因此只会出现面板定位的框。动画从不移动。(gif图像) 如果我在a中读取时禁用表单,我可以看到带有gif的面板,但它不会移动。它保持静止和灰色 我尝试运行另一个窗体,在另一个繁忙窗体的上方运行动画,但我使它有时工作,有时不工作的方式 ReallyBusyForm.Show(); R

我有以下情况,我有一个表单应用程序,需要加载很多UI控件。我有一个加载动画,它是在每一个其他控制。 我希望动画在加载过程中保持在上方并运行。 在过程结束时,带有动画的面板可能会消失

由于UI正忙于创建和定位每个新控件,因此只会出现面板定位的框。动画从不移动。(gif图像)

如果我在a中读取时禁用表单,我可以看到带有gif的面板,但它不会移动。它保持静止和灰色

我尝试运行另一个窗体,在另一个繁忙窗体的上方运行动画,但我使它有时工作,有时不工作的方式

ReallyBusyForm.Show();
ReallyBusyForm.Focus();

var floatingWindow = new FloatingLoadingWindow();
Task.Run(() => floatingWindow.ShowDialog());
await Task.Run(() => ReallyBusyForm.LoadYourControls());
Invoke((MethodInvoker)(() =>
{
    while (Application.OpenForms["FloatingLoadingWindow"] == null)
    {
        Thread.Sleep(200);
    }
    floatingWindow.Close();
}));
我认为这有时有效,有时无效,因为不保证floatingWindow.ShowDialog()在加载控件之前运行。 如果它在我获得所需的视觉效果之前运行。如果它在我看到ReallyBusyForm如何创建和添加每个子控件之后运行。 如果我进行同步调用,那么我会阻止控件的加载

floatingWindow.ShowDialog(); //this call obviously block the execution of what comes next
await Task.Run(() => ReallyBusyForm.LoadYourControls());

因此,当打开一个正在忙于创建其子控件的窗体时,我需要一种适当的方式来显示加载动画。

如果您想在WinForms中使用一个单独的线程来显示启动/加载窗口,可以从该单独的线程
Application.Run()
中显示它(也可以使用
Application.Run()
从主UI线程启动普通窗口)。寻找所谓的splashscreen。
floatingWindow.ShowDialog(); //this call obviously block the execution of what comes next
await Task.Run(() => ReallyBusyForm.LoadYourControls());