WPF使用事件聚合器,實現任意頁面跨頁通信

来源:https://www.cnblogs.com/weskynet/p/18221240
-Advertisement-
Play Games

前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。 以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可 ...


前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。

以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可以參考我的其他文章。因為本文章使用該鏈接的教程的原始demo直接進行添加:

https://mp.weixin.qq.com/s/DHKr68cIMWu0tOrO4RBjXA

在以上原始demo的基礎上(知道prism框架的引用、MVVM的實現,可以無視上面文章教程),我在主頁新建一個按鈕,用來打開對話框使用。

0   定義一個消息傳遞的類和事件。PubSubEvent是消息的發佈和訂閱事件,接收可自定義消息的數據,例如我自定義一個測試消息類型。使用預設類型也可以,例如bool、string等等。 0   主頁面裡面,註入IEventAggregator服務介面,然後在構造函數裡面直接定義消息接收方法GetMessage,該方法用來接收其他頁面傳遞的消息,併在debug控制台輸出結果。 0   創建一個用戶控制項,並提供一個輸入框和一個按鈕,用來做測試發送消息使用。 0 對應的ViewModel裡面,需要繼承 IDialogAware,用來代表他是一個彈出對話框(你是頁面也行,問題不大,對話框的目的是為了接收主頁面傳遞數據給對話彈出框)。然後在對話框打開方法裡面,假設接收一個參數為“message”的string類型數據。 0 對話框裡面新增輸入框的數據綁定屬性,用於等下對話框打開以後,主頁面傳遞的消息參數可以馬上被對話框獲取到並顯示到頁面的輸入框裡面,當做驗證。 0 主頁面的按鈕,用來彈出對話框,並且傳入一個message參數。res可以用來接收返回值,此處不再演示,原理一樣。 0 彈出框關閉方法裡面也可以新增回傳的消息,用法和打開彈出框雷同,感興趣可以自行嘗試。 在App.xaml.cs裡面註冊對話框 0 啟動程式,先測試一下彈出框打開效果。可以發現,彈出框被打開,並且輸入框裡面的數據就是打開彈出框時候,主頁面傳入的數據。 0 在對話框的業務代碼裡面,按鈕的事件裡面新增一個消息發佈內容,用來把消息(輸入框輸入的內容和當前時間)發佈給TestMessageEvent事件,只要其他地方有訂閱該事件,均可收到該發佈的消息數據。 0 前面主頁面已經寫好了消息接收的方法。現在運行看一下效果:   0 再發送一個其他內容,例如 公眾號:【Dotnet Dancer】,同樣的,也可以成功被接收到。這個就是跨頁面通信的使用方式,不管你的頁面是父級、子級、爺孫級別、甚至毫無關聯的頁面,只要在同一個程式裡面,都可以這樣互相傳遞消息。 0

以上內容核心代碼:

1、打開對話框

private void ExecuteOpenDialog()
{
    DialogParameters pairs = new DialogParameters();
    pairs.Add("message", "這是一個測試消息");
    _dialogService.ShowDialog("TestDialog", pairs, (res) => {});
}

 

2、消息發佈與接收:

//發佈

 private void ExcuteSendMessage (){
     TestMessage message = new TestMessage();
     message.Now = DateTime.Now;
     message.Message = this.Message;
     _aggregator.GetEvent<TestMessageEvent>().Publish(message);
 }
 
//接收
_aggregator.GetEvent<TestMessageEvent>().Subscribe(GetMessage);
 private void GetMessage(TestMessage message)
 {
     Debug.WriteLine($"{message.Now}>>>>>>{message.Message}");
 }

 

3、對話框參數接收:

public void OnDialogOpened(IDialogParameters parameters)
 {
     string message = parameters.GetValue<string>("message");
     this.Message = message;
 }
 

以上就是該文章的全部內容,如果需要以上demo源碼,可以在我個人公眾號【Dotnet Dancer】後臺回覆"聚合器”即可獲取demo源碼下載鏈接。

 

 

歡迎加入QQ群: 群號:1079830632 WeskyNet交流群
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 從 Spring Boot 3.1 升級 1.1 參數名稱發現 Spring Boot 3.2 使用的 Spring Framework 版本不再嘗試通過解析位元組碼來推斷參數名稱。如果您在依賴註入或屬性綁定時遇到問題,請務必檢查您是否在編譯時使用了 -parameters 選項。有關更多詳細信息 ...
  • 1 現象 SpringBoot由3.1.0升級為3.2.0時報的錯: 直接debug進入該行,看到報錯的bean信息: 看到是MyBatis出問題。 2 處理 MyBatis 先想到mybatis-spring版本較低導致。 大家應該都用的MyBatisPlus,其實可暫緩升級3.2,等待一段時間, ...
  • 概述 什麼是配置?chatGPT是這麼回答的: 配置項(Configuration Item)是一個廣泛使用的術語,尤其在軟體開發、系統管理和IT服務管理中。它通常指的是系統或應用程式中的一個可配置的元素,可以用來調整系統或應用的行為、性能或其他特性。配置項可以是軟體、硬體、文檔、資料庫、參數設置等 ...
  • 將多個第三方包封裝成一個項目後,如果你的目的是讓其他開發人員可以直接引用這些依賴,一般來說有兩種常見的方式: 打成JAR包:將封裝好的項目編譯打包成JAR文件,其他開發人員可以將這個JAR文件添加到他們的項目中,併在項目的構建工具(比如Maven)中配置該JAR作為依賴。這樣做的好處是簡單直接,其他 ...
  • 本文介紹在Visual Studio中,通過屬性表,使得一個新建解決方案中的項目可以快速配置已有解決方案的項目中各類已編譯好的C++第三方庫的方法~ ...
  • strcpy和memcpy 目錄strcpy和memcpy 複製內容: strcpy:專門用於複製字元串,它會一直複製直到遇到源字元串中的'\0'結束符。這意味著如果源字元串長度超過了目標緩衝區的大小(不包括'\0'),就會發生緩衝區溢出,這是一個常見的安全隱患。 memcpy:可以複製任意內容,如 ...
  • 正文 晚上跳舞回來,在便利店照例買根冰淇淋吃。看到店裡的老闆娘在訓她孩子。言辭依稀可以聽見考上好初中之類。 當時一個臨時起意,打算買兩根冰淇淋,塞一根到他手上,說一句:“我小時候也老被罵,沒什麼。” 然後跑掉。但是在冰櫃里翻了半天,都沒找到自己想吃的那種。與此同時,聽到他媽媽聲色俱厲地說:“你知道我小時 ...
  • 在這篇文章中,我們介紹瞭如何利用大型語言模型為情人節營造難忘的氛圍。通過上傳圖片併進行風格轉化,我們可以為對方呈現一幅獨特的作品,增添浪漫的色彩。同時,藉助搜索功能,我們能夠輕鬆獲取與情人節相關的信息,為策劃活動提供更多靈感和建議。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...