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

WeskyNet發表於2024-05-29

前言:最近幾天有好幾個小夥伴玩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原始碼下載連結。

相關文章