热门标签 | 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.         }  

 

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

 

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

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


推荐阅读
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 小程序获取用户信息按钮返回中文地址
    1.我是根据官方文档中描述去写的按钮 可以看到button中加了zh_CNopen-typegetUserInfobindgetuserinfogetU ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 在JavaScript中,函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最后一个有效。如果调用函数时传入的参数个数与函数定义时的参数个数不符,会出现不同的情况。函数调用时,传入的参数个数少于函数定义时的参数个数,未传入的参数会被当做undefined处理,可能会导致错误。而传入的参数个数多于函数定义时的参数个数,多余的参数不会被使用,但不会报错。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • JS实现一键分享功能
    本文介绍了如何使用JS实现一键分享功能,并提供了2019独角兽企业招聘Python工程师的标准。同时,给出了分享到QQ空间、新浪微博和人人网的链接。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • jQuery实现简单的动画效果及用法详解
    本文详细介绍了使用jQuery实现简单动画效果的方法,包括显示/隐藏、向上收缩/向下展开、淡入/淡出、自定义动画等。同时提供了具体的用法示例,并解释了参数的含义和使用技巧。通过本文的学习,读者可以掌握如何使用jQuery实现各种动画效果,为网页增添生动和互动性。 ... [详细]
  • 最近在使用C#进行录屏,通过调用ffmpeg的cmd命令进行录制。设置的录制时长是30秒,但实际只录制了11秒就停止了。关闭程序后,又开始录制并成功录制了30秒。请问大神,这是什么原因?附上了简单的调用程序。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
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社区 版权所有