C#WinForm实现Loading等待界面

发布时间:2019-09-10 21:17:12 阅读:21

    上篇博客中解决了程序加载时屏幕闪烁的问题。

    但是,加载的过程变得很缓慢。

    这个给用户的体验也不是很好,我这里想加一个Loading的进度条。

    项目启动的时候,加载进度条,界面UI加载完毕,进度条消失。

     

    文末有资源,可下载。

     

    新建一个项目,添加一个窗体。窗体中添加一个pictureBox,添加Loading图片。

    12121212.png

     

    设置窗体属性

    StartPosition :CenterScreen在屏幕中心显示

     

    TopMost:True置顶显示

     

    ShowInTaskbar:False不在任务栏显示

     

    FormBorderStyle:None不显示窗体边框和标题栏

     

    TransparencyKey:Control颜色为Control的部分透明

     

    BackColor:Control窗体背景颜色设为Control

     

    调用:

    LoadingHelper.ShowLoadingScreen();//显示
    LoadingHelper.CloseForm();//关闭

     

    Loading窗体代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace loadingForm
    {
        public partial class loading : Form
        {
            public loading()
            {
                InitializeComponent();
            }
     
            private void loading_Load(object sender, EventArgs e)
            {
                //this.BackColor = Color.Transparent;
                this.Opacity = 1;
     
            }
     
            /// <summary>
            /// 关闭命令
            /// </summary>
            public void closeOrder()
            {
                if (this.InvokeRequired)
                {
                    //这里利用委托进行窗体的操作,避免跨线程调用时抛异常,后面给出具体定义
                    CONSTANTDEFINE.SetUISomeInfo UIinfo = new CONSTANTDEFINE.SetUISomeInfo(new Action(() =>
                    {
                        while (!this.IsHandleCreated)
                        {
                            ;
                        }
                        if (this.IsDisposed)
                            return;
                        if (!this.IsDisposed)
                        {
                            this.Dispose();
                        }
     
                    }));
                    this.Invoke(UIinfo);
                }
                else
                {
                    if (this.IsDisposed)
                        return;
                    if (!this.IsDisposed)
                    {
                        this.Dispose();
                    }
                }
            }
     
            private void loading_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (!this.IsDisposed)
                {
                    this.Dispose(true);
                }
     
            }
        }
        class CONSTANTDEFINE
        {
            public delegate void SetUISomeInfo();
        }
    }

     

    Loading类代码:LoadingHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
     
    namespace loadingForm
    {
        public class LoadingHelper
        {
            #region 相关变量定义
            /// <summary>
            /// 定义委托进行窗口关闭
            /// </summary>
            private delegate void CloseDelegate();
            private static loading loadingForm;
            private static readonly Object syncLock = new Object();  //加锁使用
     
            #endregion
     
            //private LoadingHelper()
            //{
     
            //}
     
            /// <summary>
            /// 显示loading框
            /// </summary>
            public static void ShowLoadingScreen()
            {
                // Make sure it is only launched once.
                if (loadingForm != null)
                    return;
                Thread thread = new Thread(new ThreadStart(LoadingHelper.ShowForm));
                thread.IsBackground = true;
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
     
            }
            /// <summary>
            /// 显示窗口
            /// </summary>
            private static void ShowForm()
            {
                if (loadingForm != null)
                {
                    loadingForm.closeOrder();
                    loadingForm = null;
                }
                loadingForm = new loading();
                loadingForm.TopMost = true;
                loadingForm.ShowDialog();
            }
            /// <summary>
            /// 关闭窗口
            /// </summary>
            public static void CloseForm()
            {
                Thread.Sleep(50); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
                if (loadingForm != null)
                {
                    lock (syncLock)
                    {
                        Thread.Sleep(50);
                        if (loadingForm != null)
                        {
                            Thread.Sleep(50);  //通过三次延时,确保可以彻底关闭窗口
                            loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));
                        }
                    }
                }
            }
            /// <summary>
            /// 关闭窗口,委托中使用
            /// </summary>
            private static void CloseFormInternal()
            {
                loadingForm.closeOrder();
                loadingForm = null;
            }
        }
    }

     

    有好的建议,请在下方输入你的评论。

资源下载:

关键字C#