Winform彈出新視窗,遮罩舊視窗
阿新 • • 發佈:2019-01-02
有時我們在處理一些事件的時候,會等待事件完成才允許使用者操作,
我為這個問題提供了一個解決方法,比如在點選一個Button或其它控制元件的時候,彈出一個新視窗,然後遮罩住原來的視窗,使使用者不能對原來的視窗進行操作,直到事件處理完成後,關閉開啟的視窗..
有一種方法是註冊事件的委託,然後在委託的回撥中對新視窗進行關閉.
程式碼如下:
- /// <summary>
- /// 你需要處理的事情的方法委託
- /// </summary>
- /// <param name="arg"></param>
-
publicdelegatevoid DoVerbHandler(
- /// <summary>
- /// 按鈕事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- privatevoid 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!");
- }
- /// <summary>
- /// 你需要在窗體遮罩的時候要做的事情
- /// </summary>
- /// <param name="arg"></param>
- privatevoid DoVerbMethod(object arg)
- {
-
for (int
- {
- Thread.Sleep(10);
- }
- }
- /// <summary>
- /// DoVerbMethod方法執行結束後的回撥
- /// </summary>
- /// <param name="iar"></param>
- privatevoid DoVerbCompleted(IAsyncResult iar)
- {
- Form frm = (Form)iar.AsyncState;
- if (frm.InvokeRequired)
- {
- frm.Invoke(new AsyncCallback(DoVerbCompleted), iar);
- }
- else
- {
- frm.Close();
- }
- }
但是我在實際使用中,DoVerbMethod這個方法會對UI介面進行更新,除錯的時候開發環境會給出一些提示,意思是:"不能對別的程序建立的控制元件進行UI更新",如果對每個控制元件的UI更新都要在回撥中來完成的話,那程式邏輯顯得比較複雜...
所以我想出了下面的方法來解決.思路是在非同步開啟一個新視窗,然後執行你的事件處理,等事件處理完後關閉新視窗,這樣沒有執行委託的回撥也一樣解決了問題,特將此方法發來分享.
程式碼如下:
- /// <summary>
- /// 全域性變數,yourForm為新視窗的名字
- /// </summary>
- Form yourForm = new Form();
- /// <summary>
- /// 你需要處理的事情的方法委託
- /// </summary>
- /// <param name="arg"></param>
- publicdelegatevoid DoVerbHandler(object arg);
- /// <summary>
- /// 按鈕事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- privatevoid button1_Click(object sender, EventArgs e)
- {
- DoVerbHandler invoker = new DoVerbHandler(ShowProcessWindow);
- //發起一個執行緒,非同步執行開啟一個新視窗
- invoker.BeginInvoke(null,null);
- //你需要在窗體遮罩的時候要做的事情
- DoVerbMethod();
- yourForm.Close();
- }
- /// <summary>
- /// 事件處理示例方法
- /// </summary>
- /// <param name="arg"></param>
- privatevoid DoVerbMethod()
- {
- for (int i = 0; i < 100; i++)
- {
- Thread.Sleep(10);
- }
- }
- privatevoid ShowProcessWindow()
- {
- yourForm.ShowDialog();
- }
關鍵字:彈出視窗等待程式處理完關閉,視窗遮罩,
我在實際專案使用上,並沒有發現這個方法出現問題,
希望各位朋友能參與討論一下..呵呵