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