学习大佬的视频地址:https://www.bilibili.com/video/BV1nY411a7T8/?p=58&spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=a4e06be300e655612460fd5149552558
然后从大佬的代码中学习
//事件模型 public class MessageModel { public string Filter { get; set; } public string Message { get; set; } } public class MessageEvent : PubSubEvent<MessageModel> { } public static class DialogExtensions { /// <summary> /// 询问窗口 /// </summary> /// <param name="dialogHost">指定的DialogHost会话主机</param> /// <param name="title">标题</param> /// <param name="content">询问内容</param> /// <param name="dialogHostName">会话主机名称(唯一)</param> /// <returns></returns> public static async Task<IDialogResult> Question(this IDialogHostService dialogHost, string title, string content, string dialogHostName = "Root" ) { DialogParameters param = new DialogParameters(); param.Add("Title", title); param.Add("Content", content); param.Add("dialogHostName", dialogHostName); var dialogResult = await dialogHost.ShowDialog("MsgView", param, dialogHostName); return dialogResult; } /// <summary> /// 推送等待消息 /// </summary> /// <param name="aggregator"></param> /// <param name="model"></param> public static void UpdateLoading(this IEventAggregator aggregator, UpdateModel model) { aggregator.GetEvent<UpdateLoadingEvent>().Publish(model); } /// <summary> /// 注册等待消息 /// </summary> /// <param name="aggregator"></param> /// <param name="action"></param> public static void Resgiter(this IEventAggregator aggregator, Action<UpdateModel> action) { aggregator.GetEvent<UpdateLoadingEvent>().Subscribe(action); } /// <summary> /// 注册提示消息 /// </summary> /// <param name="aggregator"></param> /// <param name="action"></param> public static void ResgiterMessage(this IEventAggregator aggregator, Action<MessageModel> action, string filterName = "Main") { aggregator.GetEvent<MessageEvent>().Subscribe(action, ThreadOption.PublisherThread, true, (m) => { return m.Filter.Equals(filterName); }); } /// <summary> /// 发送提示消息 /// </summary> /// <param name="aggregator"></param> /// <param name="message"></param> public static void SendMessage(this IEventAggregator aggregator, string message, string filterName = "Main") { aggregator.GetEvent<MessageEvent>().Publish(new MessageModel() { Filter = filterName, Message = message, }); } }
然后接受消息地方
public MainView(IEventAggregator aggregator, IDialogHostService dialogHostService) { InitializeComponent(); //注册提示消息 aggregator.ResgiterMessage(arg => { Snackbar.MessageQueue.Enqueue(arg); }); //注册等待消息窗口 aggregator.Resgiter(arg => { DialogHost.IsOpen = arg.IsOpen; if (DialogHost.IsOpen) DialogHost.DialogContent = new ProgressView(); }); btnMin.Click += (s, e) => { this.WindowState = WindowState.Minimized; }; btnMax.Click += (s, e) => { if (this.WindowState == WindowState.Maximized) this.WindowState = WindowState.Normal; else this.WindowState = WindowState.Maximized; }; btnClose.Click += async (s, e) => { var dialogResult = await dialogHostService.Question("温馨提示", "确认退出系统?"); if (dialogResult.Result != Prism.Services.Dialogs.ButtonResult.OK) return; this.Close(); }; ColorZone.MouseMove += (s, e) => { if (e.LeftButton == MouseButtonState.Pressed) this.DragMove(); }; ColorZone.MouseDoubleClick += (s, e) => { if (this.WindowState == WindowState.Normal) this.WindowState = WindowState.Maximized; else this.WindowState = WindowState.Normal; }; menuBar.SelectionChanged += (s, e) => { drawerHost.IsLeftDrawerOpen = false; }; this.dialogHostService = dialogHostService; }
发送消息的地方
public LoginView(IEventAggregator aggregator) { InitializeComponent(); //注册提示消息 aggregator.ResgiterMessage(arg => { LoginSnakeBar.MessageQueue.Enqueue(arg.Message); }, "Login"); }
DialogService服务
public interface IDialogHostAware { /// <summary> /// DialoHost名称 /// </summary> string DialogHostName { get; set; } /// <summary> /// 打开过程中执行 /// </summary> /// <param name="parameters"></param> void OnDialogOpend(IDialogParameters parameters); /// <summary> /// 确定 /// </summary> DelegateCommand SaveCommand { get; set; } /// <summary> /// 取消 /// </summary> DelegateCommand CancelCommand { get; set; } }
public interface IDialogHostService : IDialogService { Task<IDialogResult> ShowDialog(string name, IDialogParameters parameters, string dialogHostName = "Root"); }
/// <summary> /// 对话主机服务(自定义) /// </summary> public class DialogHostService : DialogService, IDialogHostService { private readonly IContainerExtension containerExtension; public DialogHostService(IContainerExtension containerExtension) : base(containerExtension) { this.containerExtension = containerExtension; } public async Task<IDialogResult> ShowDialog(string name, IDialogParameters parameters, string dialogHostName = "Root") { if (parameters == null) parameters = new DialogParameters(); //从容器当中去除弹出窗口的实例 var content = containerExtension.Resolve<object>(name); //验证实例的有效性 if (!(content is FrameworkElement dialogContent)) throw new NullReferenceException("A dialog's content must be a FrameworkElement"); if (dialogContent is FrameworkElement view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null) ViewModelLocator.SetAutoWireViewModel(view, true); if (!(dialogContent.DataContext is IDialogHostAware viewModel)) throw new NullReferenceException("A dialog's ViewModel must implement the IDialogAware interface"); viewModel.DialogHostName = dialogHostName; DialogOpenedEventHandler eventHandler = (sender, eventArgs) => { if (viewModel is IDialogHostAware aware) { aware.OnDialogOpend(parameters); } eventArgs.Session.UpdateContent(content); }; return (IDialogResult)await DialogHost.Show(dialogContent, viewModel.DialogHostName, eventHandler); } }
使用,构造函数注入
/// <summary> /// 添加待办事项 /// </summary> async void AddToDo(ToDoDto model) { DialogParameters param = new DialogParameters(); if (model != null) param.Add("Value", model); var dialogResult = await dialog.ShowDialog("AddToDoView", param); if (dialogResult.Result == ButtonResult.OK) { try { UpdateLoading(true); var todo = dialogResult.Parameters.GetValue<ToDoDto>("Value"); if (todo.Id > 0) { var updateResult = await toDoService.UpdateAsync(todo); if (updateResult.Status) { var todoModel = summary.ToDoList.FirstOrDefault(t => t.Id.Equals(todo.Id)); if (todoModel != null) { todoModel.Title = todo.Title; todoModel.Content = todo.Content; } } } else { var addResult = await toDoService.AddAsync(todo); if (addResult.Status) { summary.Sum += 1; summary.ToDoList.Add(addResult.Result); summary.CompletedRatio = (summary.CompletedCount / (double)summary.Sum).ToString("0%"); this.Refresh(); } } } finally { UpdateLoading(false); } } }
DialogParameters那传递参数
标签:WindowState,string,aggregator,param,学习,prism,var,public From: https://www.cnblogs.com/shuaimeng/p/18319792