一、Show與ShowDialog眾所周知在c#中有兩種顯示視窗的方式:模態顯示(showdialog)與非模態顯示(show),模態顯示會阻塞調用視窗的所有消息響應,在調用ShowDialog方法後,直到關閉對話框後,才執行此方法後面的代碼 ,期間用戶是無法對該視窗外的界面進行ui交互的;非模態顯 ...
一、Show與ShowDialog
眾所周知在c#中有兩種顯示視窗的方式:模態顯示(showdialog)與非模態顯示(show),模態顯示會阻塞調用視窗的所有消息響應,在調用ShowDialog方法後,直到關閉對話框後,才執行此方法後面的代碼 ,期間用戶是無法對該視窗外的界面進行ui交互的;非模態顯示則不會,可以在彈出視窗和調用視窗之間隨意切換。調用視窗調用show方法後,下麵的代碼可以立即執行。
二、實現不阻塞的等待
那麼如果我們想實現一個新的視窗顯示方法,既可以像模態顯示那樣,在關閉對話框的時候才執行顯示方法後的代碼,又可以像非模態顯示那樣不阻塞消息響應,不影響用戶的UI操作。這裡我們就要用到一個方法Dispatcher.PushFrame
想深入瞭解的可以參考這篇文章:https://www.h3399.cn/201709/148010.html
下麵直說代碼使用
首先需要引入WindowBase類庫,然後
DispatcherFrame _dispatcherFrame = new DispatcherFrame();
Form1 Window = new Form1();
Window.Show();
Dispatcher.PushFrame(_dispatcherFrame);
這樣就達到了偽阻塞,後面的代碼不會執行,但又不影響其他UI操作。但一般這種會引起其他問題,需註意,因為之所以要下麵代碼不執行,肯定是需要form返回的結果的,用戶能做UI操作了,就會有很多可能,比如退出程式,新打開窗體等,可能會導致錯誤。
結束偽阻塞,代碼如下:
在窗體的關閉事件中添加如下代碼即可
_dispatcherFrame.Continue = false; _dispatcherFrame = null;
到此代碼就結束了。至於原理,想看詳細的看上面的鏈接中的文章,這裡我也簡單總結下:
就是Dispatcher.PushFrame用於開啟一個新的window消息while迴圈,這樣阻塞了ui主線程,用這個新開啟的window消息迴圈處理用戶的UI操作,而DispatcherFrame我認為算是一個控制器,它的Continue屬性能退出消息迴圈,回到主線程的window消息迴圈中。
所以這個方法也算阻塞了主線程,新開一個window消息隊列處理用戶操作。