winform用show實現showdialog的模態化效果

来源:https://www.cnblogs.com/dachuang/archive/2023/03/23/17248578.html
-Advertisement-
Play Games

一、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消息隊列處理用戶操作。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇文章將深入介紹 Yarn 三種調度器。Yarn 本身作為資源管理和調度服務,其中的資源調度模塊更是重中之重。下麵將介紹 Yarn 中實現的調度器功能,以及內部執行邏輯。 ...
  • 本文實現一個Echo TCP Server 完整代碼:https://github.com/csgopher/go-redis interface/tcp/Handler.go type Handler interface { Handle(ctx context.Context, conn net ...
  • 繼上一個博客中生成 簽章圖片後,今日遇到一個問題, 本地不管如何改代碼,都會將簽名文字顯示出來。 但是.... ....... 一旦部署在linux系統後,一直列印不出來,,糾結的呀。。 完全沒想到, 原來是linux系統裡面不相容本地的字體,也就是沒有那麼多中文字體,除非安裝。 可以驚醒安裝字體: ...
  • 在java打演算法題的時候,Scanner類、Sout的速度太慢,所以要用PrintWriter和BufferReader&StreamTokenizer類來進行快速輸入。代碼如下: import java.io.*; public class Main { public static PrintWr ...
  • 記憶體重疊是指在記憶體中存在兩個或多個區域,它們的地址範圍有交叉部分。在 C++ 中,記憶體重疊可能會導致程式出現不可預期的行為,因此我們需要瞭解它的原因和如何避免。 記憶體重疊的原因 記憶體重疊的主要原因是指針的使用。當我們使用指針訪問記憶體時,如果指針指向的記憶體區域與另一個區域有交叉部分,就會產生記憶體重疊。 ...
  • Mybatis高級特性能夠幫助我們更加靈活地操作資料庫,包括動態SQL、緩存機制、插件機制、自定義類型轉換等。學習這些特性可以讓我們更好地利用Mybatis,提高數據操作的效率和質量。 未來的道路由自己抉擇,事業的高度由自己決定。 動態SQL 動態SQL中,Mybatis提供了多種標簽來幫助我們構建 ...
  • 一、問題引入 在學習棧的過程中,教材有一個案例:利用棧結果解析括弧的匹配問題。括弧問題:[({}{})],說明 [] 、() 、{} 稱為一對。 號碼位置對應的括弧之間進行匹配,結果:0-7、 1-6、 2-3、 4-5 二、過程記錄 💡 基於順序棧實現 利用棧的特性:先進後出 ,對括弧進行匹配輸 ...
  • 本系列將和大家分享Redis分散式緩存,本章主要簡單介紹下Redis中的布隆過濾器(Bloom Filter),以及如何破解ServiceStack和如何解決緩存雪崩、緩存穿透、緩存擊穿、緩存預熱問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...