上篇博客中解决了程序加载时屏幕闪烁的问题。
但是,加载的过程变得很缓慢。
这个给用户的体验也不是很好,我这里想加一个Loading的进度条。
项目启动的时候,加载进度条,界面UI加载完毕,进度条消失。
文末有资源,可下载。
新建一个项目,添加一个窗体。窗体中添加一个pictureBox,添加Loading图片。
设置窗体属性
StartPosition :CenterScreen在屏幕中心显示
TopMost:True置顶显示
ShowInTaskbar:False不在任务栏显示
FormBorderStyle:None不显示窗体边框和标题栏
TransparencyKey:Control颜色为Control的部分透明
BackColor:Control窗体背景颜色设为Control
调用:
scss
复制代码
LoadingHelper.ShowLoadingScreen();//显示 LoadingHelper.CloseForm();//关闭
Loading窗体代码:
csharp
复制代码
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
csharp
复制代码
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; } } }
原文链接:点击这里,走你
有好的建议,请在下方输入你的评论。
欢迎访问个人博客guanchao.site
欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”