前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。 以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可 ...
前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。
以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可以參考我的其他文章。因為本文章使用該鏈接的教程的原始demo直接進行添加:
https://mp.weixin.qq.com/s/DHKr68cIMWu0tOrO4RBjXA
在以上原始demo的基礎上(知道prism框架的引用、MVVM的實現,可以無視上面文章教程),我在主頁新建一個按鈕,用來打開對話框使用。
定義一個消息傳遞的類和事件。PubSubEvent是消息的發佈和訂閱事件,接收可自定義消息的數據,例如我自定義一個測試消息類型。使用預設類型也可以,例如bool、string等等。 主頁面裡面,註入IEventAggregator服務介面,然後在構造函數裡面直接定義消息接收方法GetMessage,該方法用來接收其他頁面傳遞的消息,併在debug控制台輸出結果。 創建一個用戶控制項,並提供一個輸入框和一個按鈕,用來做測試發送消息使用。 對應的ViewModel裡面,需要繼承 IDialogAware,用來代表他是一個彈出對話框(你是頁面也行,問題不大,對話框的目的是為了接收主頁面傳遞數據給對話彈出框)。然後在對話框打開方法裡面,假設接收一個參數為“message”的string類型數據。 對話框裡面新增輸入框的數據綁定屬性,用於等下對話框打開以後,主頁面傳遞的消息參數可以馬上被對話框獲取到並顯示到頁面的輸入框裡面,當做驗證。 主頁面的按鈕,用來彈出對話框,並且傳入一個message參數。res可以用來接收返回值,此處不再演示,原理一樣。 彈出框關閉方法裡面也可以新增回傳的消息,用法和打開彈出框雷同,感興趣可以自行嘗試。 在App.xaml.cs裡面註冊對話框 啟動程式,先測試一下彈出框打開效果。可以發現,彈出框被打開,並且輸入框裡面的數據就是打開彈出框時候,主頁面傳入的數據。 在對話框的業務代碼裡面,按鈕的事件裡面新增一個消息發佈內容,用來把消息(輸入框輸入的內容和當前時間)發佈給TestMessageEvent事件,只要其他地方有訂閱該事件,均可收到該發佈的消息數據。 前面主頁面已經寫好了消息接收的方法。現在運行看一下效果: 再發送一個其他內容,例如 公眾號:【Dotnet Dancer】,同樣的,也可以成功被接收到。這個就是跨頁面通信的使用方式,不管你的頁面是父級、子級、爺孫級別、甚至毫無關聯的頁面,只要在同一個程式裡面,都可以這樣互相傳遞消息。以上內容核心代碼:
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