WinForm下的loading框的实现
前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一个等待控件重画的过程,非常的不友好,因此在这里添加一个loading框进行等待显示。
实现:在经过多方面查询资料,终于是实现了一个完整的loading框程序,这里主要解决在多次点击查询按钮或者加载数据时出现的:执行 CreateHandle() 时无法调用值 Close()或者无法访问已释放的对象或者在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。这三个问题困扰我很久,最终通过不断的调试,将其解决,话不多说,直接上代码。
1.下面类为loading框帮助类,在实际调用过程中,使用该类调用相关函数即可。
- class LoadingHelper
- {
- #region 相关变量定义
- /// <summary>
- /// 定义委托进行窗口关闭
- /// </summary>
- private delegate void CloseDelegate();
- private static LoaderForm 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 LoaderForm();
- loadingForm.TopMost = true;
- loadingForm.ShowDialog();
- }
- /// <summary>
- /// 关闭窗口
- /// </summary>
- public static void CloseForm()
- {
- Thread.Sleep(); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
- if (loadingForm != null)
- {
- lock (syncLock)
- {
- Thread.Sleep();
- if (loadingForm != null)
- {
- Thread.Sleep(); //通过三次延时,确保可以彻底关闭窗口
- loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));
- }
- }
- }
- }
- /// <summary>
- /// 关闭窗口,委托中使用
- /// </summary>
- private static void CloseFormInternal()
- {
- loadingForm.closeOrder();
- loadingForm = null;
- }
- }
2.LoaderForm窗体具体代码如下。
- public partial class LoaderForm : Form
- {
- public LoaderForm()
- {
- InitializeComponent();
- }
- /// <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 LoaderForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- if (!this.IsDisposed)
- {
- this.Dispose(true);
- }
- }
- }
对LoaderForm窗体相关说明:
1.public delegate void SetUISomeInfo(); //定义一个委托,处理UI相关信息问题。
2.LoaderForm窗体上放置了一个label,将其AutoSize属性设置为false,并将LoaderForm的TransparencyKey属性设置为Transparent(这样设置避免在加载loading框时出现背景,loading.gif最好选择透明背景的图片)。
至此,一个完整的loading框,已经搞定。
by Shawn Chen,2017.7.2日,晚。
WinForm下的loading框的实现的更多相关文章
- WinForm下的loading框实现
前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一个等待控件重画的过程,非常的不友好,因此在这里添加一个loading框进行等待显示. 实现:在经过多方面查询资料, ...
- winform下的智能提示框
winform下的智能提示框 最近在搞winform的程序,接触到有些可能以后还会用到的功能,所以写到博客园里去,第一可以加深自己的印象,第二可以在以后再遇到同样问题的时候忘记了可以马上回来看看,第三 ...
- 关于Winform下DataGridView中实现checkbox全选反选、同步列表项的处理
近期接手一个winform 项目,虽然之前有.net 的经验,但是对一些控件的用法还不是很熟悉. 这段时间将会记录一些在工作中遇到的坎坷以及对应的解决办法,写出来与大家分享并希望大神提出更好解决方法来 ...
- WinForm下开发插件DevExpress安装及使用
WinForm下开发插件DevExpress安装及使用在Visual Studio中安装DevExpress开发插件插件的使用方法简单的Demo介绍下载链接:https://pan.baidu.com ...
- C#winform如何实现文本编辑框(TextBox)的Hint提示文字效果
C#winform如何实现文本编辑框(TextBox)的Hint提示文字效果 private const int EM_SETCUEBANNER = 0x1501; [DllImport(" ...
- Winform下CefSharp的引用、配置、实例与报错排除(源码)
Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...
- 分享在winform下实现模块化插件编程-优化版
上一篇<分享在winform下实现模块化插件编程>已经实现了模块化编程,但我认为不够完美,存在以下几个问题: 1.IAppContext中的CreatePlugInForm方法只能依据完整 ...
- java、easyui-combotree树形下拉选择框
最近一直在研究这个树形的下拉选择框,感觉非常的有用,现在整理下来供大家使用: 首先数据库的表架构设计和三级菜单联动的表结构是一样,(父子关系) 1.下面我们用hibernate建一下对应的额实体类: ...
- 分享在winform下实现模块化插件编程
其实很早之前我就已经了解了在winform下实现插件编程,原理很简单,主要实现思路就是:先定一个插件接口作为插件样式及功能的约定,然后具体的插件就去实现这个插件接口,最后宿主(应用程序本身)就利用反射 ...
随机推荐
- glassfish SEC5054: Certificate has expired
出现这个错误的原因是某一个证书过期了 解决方法 先备份 cp /root/glassfish3/glassfish/domains/domain1/config/cacerts.jks cacerts ...
- [PHP] 算法-将一个字符串转换成一个整数的PHP实现
题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...
- 输出映射resultType
√1:简单类型 √2:简单类型列表 √3:POJO类型只有列名或列名的别名与POJO的属性名一致,该列才可以映射成功只要列名或列名的别名与POJO的属性名有一个一致,就会创建POJO对象如果列名或列名 ...
- idea代码提示
idea代码提示:Keymap-->Main menu-->Code-->Completion去掉Cyclic Expand Word的快捷键将Basic的快捷键更改为Alt+/
- layui table动态表头 改变表格头部 重新加载表格
改变头部原理: 删除原来表格, 重新建立DOM元素, 重新加载table,实现表头改变 明白了原理, 我相信大家都能写出来了, table.reload(ID, options)目前好像还不支持con ...
- 【机器学习基本理论】详解最大后验概率估计(MAP)的理解
[机器学习基本理论]详解最大后验概率估计(MAP)的理解 https://blog.csdn.net/weixin_42137700/article/details/81628065 最大似然估计(M ...
- nginx中有关 root 和 alias的主要区别
举个例子给伙伴们区别就明显看出来了,例子如下: location /img/ { alias /var/www/image/; }注意:如果按照上述配置的话,则访问/img/目录里面的文件时,ning ...
- Java判断一个字符是否是数字的几种方法的代码
在工作期间,将写内容过程经常用到的一些内容段做个记录,下面内容是关于Java判断一个字符是否是数字的几种方法的内容,希望能对码农们有好处. public class Test{ public stat ...
- 小米手机Toast显示带应用名称问题解决方法
近期为了适配刘海屏,向公司申购了一步小米8的手机,然后测试人员那边测出来一堆适配的问题,其中有一个每一个Toast会显示app的名称+显示的内容,然后网上查找了一下解决方法记录一下,顺便封装了Toas ...
- AS插件-GsonFormat
支持 field 类型的修改. 支持快捷键打开 GsonFormat ,默认为 option+s(mac), alt+s(win) 支持 field 名称的修改. 支持添加 field 前缀. 支持多 ...