C# 子线程加载窗体绑定父窗体

一、子线程加载窗体绑定父窗体关键方法

1、ChildForm.Owner 设置子窗体的所有者
2、ParentForm.BeginInvoke 引用主窗口线程避免线程错误(不是从 xxxx 线程访问)

二、使用工具类

代码如下:

public class LoadingHelper
    {
        #region 相关变量定义
        /// <summary>
        /// 定义委托进行窗口关闭
        /// </summary>
        private delegate void CloseDelegate();
        private static WaitForm1 loadingForm;
        private static Form parentForm;
        private static readonly Object syncLock = new Object();  //加锁使用
        #endregion
       

        /// 显示loading框
        /// </summary>
        public static void ShowLoadingScreen(Form form)
        {
            // Make sure it is only launched once.
            if (loadingForm != null)
                return;
            parentForm = form;
            Thread thread = new Thread(new ThreadStart(LoadingHelper.ShowChildForm));
            thread.IsBackground = true;
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();

        }
        
        /// <summary>
        /// 显示窗口
        /// </summary>
        private static void ShowChildForm()
        {
            if (loadingForm != null)    
            {
                loadingForm.Close();
                loadingForm = null;
            }
            loadingForm = new WaitForm1();
            loadingForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            loadingForm.Owner = parentForm;
            parentForm.BeginInvoke(new Action(() => { loadingForm.ShowDialog(); }));
        }

        /// <summary>
        /// 关闭窗口
        /// </summary>
        public static void CloseForm()
        {
            Thread.Sleep(100); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
            if (loadingForm != null)
            {
                lock (syncLock)
                {
                    Thread.Sleep(50);
                    if (loadingForm != null)
                    {
                        Thread.Sleep(50);  //通过三次延时,确保可以彻底关闭窗口
                        loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));                        
                    }
                }
            }
        }

引用

1、父窗口和拥有者窗口的区别
2、WinForm实现Loading等待界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值