C# winform 加载窗体有卡顿,可以先显示动画,等窗体全部加载完成,在显示窗体,关闭动画

C# winform 加载窗体有卡顿,可以先显示动画,等窗体全部加载完成,在显示窗体,关闭动画

要在C# WinForms应用程序中实现加载动画,并在主窗体完全加载后显示主窗体并关闭加载动画,您可以使用以下步骤:

  1. 创建一个简单的加载窗体(Splash Screen),用于显示加载动画。
  2. 在主窗体的构造函数或 Load 事件中显示加载窗体。
  3. 在主窗体完全初始化后隐藏加载窗体。

以下是一个简单的示例,演示了如何实现这个过程:

第一步:创建加载窗体(SplashScreen)

首先,创建一个新的WinForms窗体,命名为 SplashScreenForm.cs。在这个窗体上添加一个 PictureBox 控件来显示加载动画(可以是一个GIF动画或者静态图片)。

1public partial class SplashScreenForm : Form
2{
3    public SplashScreenForm()
4    {
5        InitializeComponent();
6        this.StartPosition = FormStartPosition.CenterScreen;
7        this.FormBorderStyle = FormBorderStyle.None;
8        this.ShowInTaskbar = false;
9        this.TopMost = true;
10        this.Show();
11    }
12
13    protected override void OnLoad(EventArgs e)
14    {
15        base.OnLoad(e);
16        ShowLoadingAnimation();
17    }
18
19    private void ShowLoadingAnimation()
20    {
21        // 这里可以加载 GIF 或者其他动画效果
22        pictureBox1.Image = Image.FromFile(@"path\to\your\loading.gif");
23    }
24}

第二步:修改主窗体(MainForm)

接下来,修改主窗体(假设名为 MainForm.cs),让它在加载过程中显示加载窗体,并在加载完成后关闭加载窗体。

1public partial class MainForm : Form
2{
3    private SplashScreenForm splashScreen;
4
5    public MainForm()
6    {
7        InitializeComponent();
8
9        // 显示加载窗体
10        splashScreen = new SplashScreenForm();
11
12        // 在后台线程中加载数据或其他耗时操作
13        Task.Run(() =>
14        {
15            LoadData(); // 模拟耗时操作
16            Invoke((MethodInvoker)delegate
17            {
18                // 关闭加载窗体
19                splashScreen.Close();
20            });
21        });
22
23        // 确保加载窗体显示在主窗体之前
24        Application.DoEvents();
25    }
26
27    private void LoadData()
28    {
29        // 模拟耗时操作
30        System.Threading.Thread.Sleep(2000);
31    }
32}

注意事项:

  • 确保所有的耗时操作都在后台线程中执行,避免阻塞UI线程。
  • 使用 Application.DoEvents() 可以确保在后台线程执行前UI线程不会阻塞,但是不要过度使用,因为它可能会导致性能问题。
  • 使用 Invoke 方法确保从后台线程安全地更新UI。
相关推荐
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程5 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk6 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*6 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue6 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man6 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang