热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Winform弹出新窗口,遮罩旧窗口

有时我们在处理一些事件的时候,会等待事件完成才允许用户操作,我为这个问题提供了一个解决方法,比如在点击一个Button或其它控件的时候,弹出一个新窗口,然后遮罩住原来的窗口,

时我们在处理一些事件的时候,会等待事件完成才允许用户操作,

 

我为这个问题提供了一个解决方法,比如在点击一个Button或其它控件的时候,弹出一个新窗口,然后遮罩住原来的窗口,使用户不能对原来的窗口进行操作,直到事件处理完成后,关闭打开的窗口..

 

有一种方法是注册事件的委托,然后在委托的回调中对新窗口进行关闭.

 

代码如下:

 

[c-sharp]  view plain copy
  1. ///   
  2. /// 你需要处理的事情的方法委托  
  3. ///   
  4. ///   
  5. public delegate void DoVerbHandler(object arg);  
  6. ///   
  7. /// 按钮事件  
  8. ///   
  9. ///   
  10. ///   
  11. private void button1_Click(object sender, EventArgs e)  
  12. {  
  13.     Form yourForm = new Form();  
  14.     DoVerbHandler invoker = new DoVerbHandler(DoVerbMethod);  
  15.     //发起一个线程,回调函数之后可以传任何你需要在回调函数中需要的参数,以便在回调函数中处理  
  16.     invoker.BeginInvoke("Argument"new AsyncCallback(DoVerbCompleted), yourForm);  
  17.     yourForm.ShowDialog();  
  18.     MessageBox.Show("Completed!");  
  19. }  
  20.   
  21. ///   
  22. /// 你需要在窗体遮罩的时候要做的事情  
  23. ///   
  24. ///   
  25. private void DoVerbMethod(object arg)  
  26. {  
  27.     for (int i = 0; i < 100; i++)  
  28.     {  
  29.         Thread.Sleep(10);  
  30.     }  
  31. }  
  32.   
  33. ///   
  34. /// DoVerbMethod方法执行结束后的回调  
  35. ///   
  36. ///   
  37. private void DoVerbCompleted(IAsyncResult iar)  
  38. {  
  39.     Form frm = (Form)iar.AsyncState;  
  40.     if (frm.InvokeRequired)  
  41.     {  
  42.         frm.Invoke(new AsyncCallback(DoVerbCompleted), iar);  
  43.     }  
  44.     else  
  45.     {  
  46.         frm.Close();  
  47.     }  
  48. }  

 

 

但是我在实际使用中,DoVerbMethod这个方法会对UI界面进行更新,调试的时候开发环境会给出一些提示,意思是:"不能对别的进程创建的控件进行UI更新",如果对每个控件的UI更新都要在回调中来完成的话,那程序逻辑显得比较复杂...

 

 

所以我想出了下面的方法来解决.思路是在异步打开一个新窗口,然后执行你的事件处理,等事件处理完后关闭新窗口,这样没有执行委托的回调也一样解决了问题,特将此方法发来分享.

 

代码如下:

[c-sharp]  view plain copy
  1. ///   
  2.         /// 全局变量,yourForm为新窗口的名字  
  3.         ///   
  4.         Form yourForm = new Form();  
  5.         ///   
  6.         /// 你需要处理的事情的方法委托  
  7.         ///   
  8.         ///   
  9.         public delegate void DoVerbHandler(object arg);  
  10.         ///   
  11.         /// 按钮事件  
  12.         ///   
  13.         ///   
  14.         ///   
  15.         private void button1_Click(object sender, EventArgs e)  
  16.         {  
  17.   
  18.             DoVerbHandler invoker = new DoVerbHandler(ShowProcessWindow);  
  19.             //发起一个线程,异步执行打开一个新窗口  
  20.             invoker.BeginInvoke(null,null);  
  21.             //你需要在窗体遮罩的时候要做的事情  
  22.             DoVerbMethod();  
  23.             yourForm.Close();  
  24.         }  
  25.   
  26.         ///   
  27.         /// 事件处理示例方法  
  28.         ///   
  29.         ///   
  30.         private void DoVerbMethod()  
  31.         {  
  32.             for (int i = 0; i < 100; i++)  
  33.             {  
  34.                 Thread.Sleep(10);  
  35.             }  
  36.         }  
  37.   
  38.         private void ShowProcessWindow()  
  39.         {  
  40.             yourForm.ShowDialog();  
  41.         }  

 

关键字:弹出窗口等待程序处理完关闭,窗口遮罩,

 

我在实际项目使用上,并没有发现这个方法出现问题,

希望各位朋友能参与讨论一下..呵呵


推荐阅读
author-avatar
倒霉熊丶JO_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有