5.3 示例及代码说明先看本示例效果,再给出相关代码说明:
文章插图
图中有三个操作:
- 点击主窗体A的【+】按钮,发送了
OpenSecondViewMessage
消息,打开子窗体B; - 打开子窗体B后,再点击主窗体A的【桃心】按钮,发送了
SendRandomDataMessage
消息,子窗体B的第二个TabItem Header
显示了消息传来的数字; - 点击子窗体B的【安卓】图标按钮,给主窗体A响应了消息
ReceivedResponseMessage
,主窗体收到后弹出一个对话框 。
public class OpenSecondViewMessage : Message{public OpenSecondViewMessage(object sender) : base(sender){}}public class SendRandomDataMessage : Message{public SendRandomDataMessage(object sender, int number) : base(sender){Number = number;}public int Number { get; set; }}public class ReceivedResponseMessage : Message{public ReceivedResponseMessage(object sender) : base(sender){}}
除了SendRandomDataMessage
传递了一个业务Number
属性,另两个消息只是起到通知作用(所以没有额外属性定义),实际开发时可能需要传递业务数据 。5.3.1 打开多窗体即上面的第一个操作:点击主窗体A的【+】按钮 , 发送了
OpenSecondViewMessage
消息,打开子窗体B 。在
RazorViews\MainView.razor
中执行按钮点击,发送打开子窗体消息:...<MCol><MButton class="mx-2" Fab Dark Color="indigo" OnClick="OpenNewSecondView"><MIcon>mdi-plus</MIcon></MButton></MCol>...@code{...void OpenNewSecondView(){ Messenger.Default.Publish(this, new OpenSecondViewMessage(this));}...}
在App.xaml.cs
里订阅打开子窗体消息:public partial class App : Application{public App(){// 订阅打开子窗口消息 , 在主窗口点击【+】按钮Messenger.Default.Subscribe<OpenSecondViewMessage>(this, msg =>{var chatWin = new SecondWindowView();chatWin.Show();}, ThreadOption.UiThread);}}
实际开发可能情况更复杂,发送的消息OpenSecondViewMessage
里带WPF窗体路由(定义的一套路径规则寻找窗体或ViewModel
),订阅的地方也可能不在主程序,在子模块的Module
类里 。5.3.2 发送业务数据即第二个操作:打开子窗体B后,再点击主窗体A的【桃心】按钮,发送了
SendRandomDataMessage
消息,子窗体B的第二个TabItem Header
显示了消息传来的数字 。- 在
RazorViews\MainView.razor
中执行按钮点击,发送业务消息(就当前时间的Millisecond
):
...<MCol><MButton class="mx-2" Fab Small Dark Color="pink" OnClick="SendNumber"><MIcon>mdi-heart</MIcon></MButton></MCol>...@code{...void SendNumber(){ Messenger.Default.Publish(this, new SendRandomDataMessage(this, DateTime.Now.Millisecond));}...}
- 在
RazorViews\SecondView.razor
的OnInitialized()
方法里订阅业务消息通知:
@using WPFBlazorChat.Messages<MApp><MToolbar><MTabs BackgroundColor="primary" Grow Dark><MTab><MBadge Color="pink" Dot>Item One</MBadge></MTab><MTab><MBadge Color="green" Content="tagCount">Item Two</MBadge></MTab><MTab><MBadge Color="deep-purple accent-4" Icon="mi-masa">Item Three</MBadge></MTab></MTabs></MToolbar><MRow><MButton class="mx-2" Fab Dark Large Color="purple" OnClick="ReponseMessage"><MIcon>mdi-android</MIcon></MButton></MRow></MApp>@code{private int tagCount = 6;protected override void OnInitialized(){// 订阅业务消息,在主窗口点击桃心按钮时触发Messenger.Default.Subscribe<SendRandomDataMessage>(this, msg =>{this.InvokeAsync(() => { this.tagCount = msg.Number; });this.StateHasChanged();}, ThreadOption.UiThread);}void ReponseMessage(){// 通知主窗体,我已经收到消息 , 请不要再发Messenger.Default.Publish(this, new ReceivedResponseMessage(this));}}
注意看,上面收到消息时有两个方法要简单说一下,看OnInitialized()
里的代码:- InvokeAsync:将
Number
赋值给变量tagCount
的代码是在InvokeAsync
方法里执行的 , 这个和WPF里的Dispatcher.Invoke
是一个意思,相当于接收数据是在子线程,而赋值这个操作会即时的绑定到<MBadge Color="green" Content="tagCount">
上 , 就需要UI线程同步 。 - StateHasChanged:相当于WPF MVVM里的
PropertyChanged
事件通知,通知推荐阅读
- 暗区突围容器箱怎么获取
- 骁龙888和骁龙870性能对比-骁龙888和骁龙870哪个好
- 真我手表t1测评_真我手表t1测评表现
- 怎样防止别人蹭wifi(最强连网神器)
- wifi如何手机上防止别人蹭网(手机wifi已连接但不可上网)
- jvm双亲委派机制详解
- 信号量 C# 多线程访问之 SemaphoreSlim【C# 进阶】
- 2022支付宝蚂蚁庄园8月19日答案
- iqoo8pro散热怎么样_iqoo8pro散热效果好吗
- 原神纸间奇旅怎么玩