prism对话服务

延续上一节代码继续,多余部分代码进行删减。

对话服务,就是一个弹框的提示,prism进行了封装。

业务:点击按钮,把值传递到弹框中,弹出框提示,在弹框中选择确定或取消,再把值传回主界面

1.代码结构

2.MainViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPFPrism.Views;

namespace WPFPrism.ViewModels
{
    public class MainViewModel : BindableBase
    {
        private readonly IDialogService dialogService;

        public DelegateCommand<string> OpenCommand { get; set; }//创建命令,string用来接收参数,例如ViewA
        public MainViewModel(IDialogService dialogService)//这里点击快速操作。拿界面定义的区域Content
        {

            OpenCommand = new DelegateCommand<string>(Open);

            this.dialogService = dialogService;
        }

        private void Open(string obj)
        {
            DialogParameters keys = new DialogParameters();
            keys.Add("title", "测试弹框");//主界面点击按钮把参数传递给弹框界面
            dialogService.ShowDialog(obj, keys, callback =>
              {
                  if (callback.Result == ButtonResult.OK)
                  {
                      string result = callback.Parameters.GetValue<string>("value");//接收传递过来的值
                  }
              });
        }
    }
}

 3.ViewDViewModel.cs

using Prism.Commands;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPFPrism.ViewModels
{
    public class ViewDViewModel : IDialogAware
    {
        public DelegateCommand CancelComm { get; set; }
        public DelegateCommand OkComm { get; set; }

        public string Title { get; set; }

        public event Action<IDialogResult> RequestClose;


        public ViewDViewModel()
        {
            CancelComm = new DelegateCommand(Cancel);
            OkComm = new DelegateCommand(Ok);
        }

        /// <summary>
        /// 确定
        /// </summary>
        private void Ok()
        {
            //RequestClose?.Invoke(new DialogResult(ButtonResult.OK));//或者返回OK
            OnDialogClosed();
        }

        /// <summary>
        /// 关闭
        /// </summary>
        private void Cancel()
        {
            RequestClose?.Invoke(new DialogResult(ButtonResult.No));
        }

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {
            DialogParameters keys = new DialogParameters();
            keys.Add("value", "hello");//把值传递给主界面
            RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keys));
        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            //首先进入这个
            //接收主界面传递过来的参数
            Title = parameters.GetValue<string>("title");
        }
    }
}

4.主界面

5.弹框的界面

6.App.xaml.cs,其实这就一句RegisterDialog,对弹框进行注册


using ModuleA;
using ModuleB;
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Modularity;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using WPFPrism.ViewModels;
using WPFPrism.Views;

namespace WPFPrism
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            //通过容器去拿MainView,也是启动的地方
            return Container.Resolve<MainView>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //依赖注入的功能,增加依赖注入要实现的内容
            //containerRegistry.RegisterForNavigation<ViewA>(); //containerRegistry.RegisterForNavigation<ViewA>("ViewA的具体名字")自定义,可以这样写;
            //containerRegistry.RegisterForNavigation<ViewB>();
            //containerRegistry.RegisterForNavigation<ViewC>();//我们依然使用C模块,C模块是当前程序的。

            //注册弹框提示的界面
            containerRegistry.RegisterDialog<ViewD, ViewDViewModel>();
        }

        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            //这里是走代码的
            //moduleCatalog.AddModule<ModuleAfile>();//加载A模块
            //moduleCatalog.AddModule<ModuleBfile>();//加载B模块
            base.ConfigureModuleCatalog(moduleCatalog);
        }
        protected override IModuleCatalog CreateModuleCatalog()
        {
            //这里是走配置的
            //return new DirectoryModuleCatalog()
            //{
            //    ModulePath = @"Modules"//这里是主程序exe同文件夹下面的Modules文件夹
            //};
            return base.CreateModuleCatalog();
        }

    }
}

注意的地方其实就2点:

打开对话框时接收主界面的信息,进行处理。

关闭对话框时把信息传递给主界面。

来源:prism对话服务_prism 对话服务_故里2130的博客-CSDN博客

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Prism库提供了一种称为"dispatch"的机制,用于在UI线程上自动分发事件。通过使用Prism的事件聚合器(EventAggregator)和订阅者模式,可以实现此功能。 在Prism中,发布者通过调用EventAggregator的Publish方法来引发事件。订阅者可以通过在订阅期间指定ThreadOption.UIThread来自动在UI线程上接收事件。这意味着当事件被发布时,订阅者的事件处理程序将在UI线程上执行,从而避免了在非UI线程上更新UI的问题。 以下是一个示例代码,演示了如何在Prism中使用dispatch机制: ```csharp // 发布者 public class TickerSymbolSelectedEvent : PubSubEvent<string> { } public class MainPageViewModel { private readonly IEventAggregator _eventAggregator; public MainPageViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; } public void PublishEvent(string message) { _eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Publish(message); } } // 订阅者 public class MainWindowViewModel { public MainWindowViewModel(IEventAggregator eventAggregator) { eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Subscribe(ShowNews, ThreadOption.UIThread); } private void ShowNews(string message) { MessageBox.Show(message); } } ``` 在上面的示例中,MainPageViewModel是一个发布者,它通过调用EventAggregator的Publish方法来引发TickerSymbolSelectedEvent事件。MainWindowViewModel是一个订阅者,它通过调用EventAggregator的Subscribe方法来订阅TickerSymbolSelectedEvent事件,并在订阅期间指定ThreadOption.UIThread,以确保ShowNews方法在UI线程上执行。 通过使用Prism的dispatch机制,可以方便地在Prism应用程序中处理UI线程上的事件分发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里2130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值