1. 程式人生 > >Winform彈出新視窗,遮罩舊視窗

Winform彈出新視窗,遮罩舊視窗

時我們在處理一些事件的時候,會等待事件完成才允許使用者操作,

我為這個問題提供了一個解決方法,比如在點選一個Button或其它控制元件的時候,彈出一個新視窗,然後遮罩住原來的視窗,使使用者不能對原來的視窗進行操作,直到事件處理完成後,關閉開啟的視窗..

有一種方法是註冊事件的委託,然後在委託的回撥中對新視窗進行關閉.

程式碼如下:

  1. /// <summary>
  2. /// 你需要處理的事情的方法委託
  3. /// </summary>
  4. /// <param name="arg"></param>
  5. publicdelegatevoid DoVerbHandler(
    object arg);  
  6. /// <summary>
  7. /// 按鈕事件
  8. /// </summary>
  9. /// <param name="sender"></param>
  10. /// <param name="e"></param>
  11. privatevoid 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. /// <summary>
  21. /// 你需要在窗體遮罩的時候要做的事情
  22. /// </summary>
  23. /// <param name="arg"></param>
  24. privatevoid DoVerbMethod(object arg)  
  25. {  
  26.     for (int
     i = 0; i < 100; i++)  
  27.     {  
  28.         Thread.Sleep(10);  
  29.     }  
  30. }  
  31. /// <summary>
  32. /// DoVerbMethod方法執行結束後的回撥
  33. /// </summary>
  34. /// <param name="iar"></param>
  35. privatevoid DoVerbCompleted(IAsyncResult iar)  
  36. {  
  37.     Form frm = (Form)iar.AsyncState;  
  38.     if (frm.InvokeRequired)  
  39.     {  
  40.         frm.Invoke(new AsyncCallback(DoVerbCompleted), iar);  
  41.     }  
  42.     else
  43.     {  
  44.         frm.Close();  
  45.     }  
  46. }  

但是我在實際使用中,DoVerbMethod這個方法會對UI介面進行更新,除錯的時候開發環境會給出一些提示,意思是:"不能對別的程序建立的控制元件進行UI更新",如果對每個控制元件的UI更新都要在回撥中來完成的話,那程式邏輯顯得比較複雜...

所以我想出了下面的方法來解決.思路是在非同步開啟一個新視窗,然後執行你的事件處理,等事件處理完後關閉新視窗,這樣沒有執行委託的回撥也一樣解決了問題,特將此方法發來分享.

程式碼如下:

  1. /// <summary>
  2.         /// 全域性變數,yourForm為新視窗的名字
  3.         /// </summary>
  4.         Form yourForm = new Form();  
  5.         /// <summary>
  6.         /// 你需要處理的事情的方法委託
  7.         /// </summary>
  8.         /// <param name="arg"></param>
  9.         publicdelegatevoid DoVerbHandler(object arg);  
  10.         /// <summary>
  11.         /// 按鈕事件
  12.         /// </summary>
  13.         /// <param name="sender"></param>
  14.         /// <param name="e"></param>
  15.         privatevoid button1_Click(object sender, EventArgs e)  
  16.         {  
  17.             DoVerbHandler invoker = new DoVerbHandler(ShowProcessWindow);  
  18.             //發起一個執行緒,非同步執行開啟一個新視窗
  19.             invoker.BeginInvoke(null,null);  
  20.             //你需要在窗體遮罩的時候要做的事情
  21.             DoVerbMethod();  
  22.             yourForm.Close();  
  23.         }  
  24.         /// <summary>
  25.         /// 事件處理示例方法
  26.         /// </summary>
  27.         /// <param name="arg"></param>
  28.         privatevoid DoVerbMethod()  
  29.         {  
  30.             for (int i = 0; i < 100; i++)  
  31.             {  
  32.                 Thread.Sleep(10);  
  33.             }  
  34.         }  
  35.         privatevoid ShowProcessWindow()  
  36.         {  
  37.             yourForm.ShowDialog();  
  38.         }  

關鍵字:彈出視窗等待程式處理完關閉,視窗遮罩,

我在實際專案使用上,並沒有發現這個方法出現問題,

希望各位朋友能參與討論一下..呵呵