作者:倒霉熊丶JO_205 | 来源:互联网 | 2023-05-18 10:08
有时我们在处理一些事件的时候,会等待事件完成才允许用户操作,我为这个问题提供了一个解决方法,比如在点击一个Button或其它控件的时候,弹出一个新窗口,然后遮罩住原来的窗口,
有时我们在处理一些事件的时候,会等待事件完成才允许用户操作,
我为这个问题提供了一个解决方法,比如在点击一个Button或其它控件的时候,弹出一个新窗口,然后遮罩住原来的窗口,使用户不能对原来的窗口进行操作,直到事件处理完成后,关闭打开的窗口..
有一种方法是注册事件的委托,然后在委托的回调中对新窗口进行关闭.
代码如下:
-
-
-
-
- public delegate void DoVerbHandler(object arg);
-
-
-
-
-
- private void button1_Click(object sender, EventArgs e)
- {
- Form yourForm = new Form();
- DoVerbHandler invoker = new DoVerbHandler(DoVerbMethod);
-
- invoker.BeginInvoke("Argument", new AsyncCallback(DoVerbCompleted), yourForm);
- yourForm.ShowDialog();
- MessageBox.Show("Completed!");
- }
-
-
-
-
-
- private void DoVerbMethod(object arg)
- {
- for (int i = 0; i < 100; i++)
- {
- Thread.Sleep(10);
- }
- }
-
-
-
-
-
- private void DoVerbCompleted(IAsyncResult iar)
- {
- Form frm = (Form)iar.AsyncState;
- if (frm.InvokeRequired)
- {
- frm.Invoke(new AsyncCallback(DoVerbCompleted), iar);
- }
- else
- {
- frm.Close();
- }
- }
但是我在实际使用中,DoVerbMethod这个方法会对UI界面进行更新,调试的时候开发环境会给出一些提示,意思是:"不能对别的进程创建的控件进行UI更新",如果对每个控件的UI更新都要在回调中来完成的话,那程序逻辑显得比较复杂...
所以我想出了下面的方法来解决.思路是在异步打开一个新窗口,然后执行你的事件处理,等事件处理完后关闭新窗口,这样没有执行委托的回调也一样解决了问题,特将此方法发来分享.
代码如下:
-
-
-
- Form yourForm = new Form();
-
-
-
-
- public delegate void DoVerbHandler(object arg);
-
-
-
-
-
- private void button1_Click(object sender, EventArgs e)
- {
-
- DoVerbHandler invoker = new DoVerbHandler(ShowProcessWindow);
-
- invoker.BeginInvoke(null,null);
-
- DoVerbMethod();
- yourForm.Close();
- }
-
-
-
-
-
- private void DoVerbMethod()
- {
- for (int i = 0; i < 100; i++)
- {
- Thread.Sleep(10);
- }
- }
-
- private void ShowProcessWindow()
- {
- yourForm.ShowDialog();
- }
关键字:弹出窗口等待程序处理完关闭,窗口遮罩,
我在实际项目使用上,并没有发现这个方法出现问题,
希望各位朋友能参与讨论一下..呵呵