当前位置:   article > 正文

WPF-Prism框架-弹窗并传参_wpf参数修改弹窗

wpf参数修改弹窗

目录

关键字总结

1.传统的弹出窗体的两种方式

 2.Prism 框架弹框


关键字总结

1.话框对应的ViewModel继承接口:IDiaLogAware

2.注册:RegisterDialog

3.控制弹窗服务API接口:IDialogService

4.传参对象:DialogParameters

5.接收参数:IDialogParameters

6.接收用到的回调:callback

7.接收窗体返回结果:dialogParameters

1.传统的弹出窗体的两种方式

方式1:直接绑定事件;

方式2:通过binding事件绑定command;

传统的打开窗体最大的问题:

方式一:视图和业务逻辑耦合性太强;

方式二:虽然已经把业务逻辑从XXX.xaml.cs分离到ViewModel中,一定程序上解决了视图和业务逻辑耦合性强的问题,但ViewModel中不建议和窗体实体产生耦合。

 2.Prism 框架弹框

1.新建弹窗:

        用用户控件的形式创建;

2.注册弹框:

在App.xaml.cs中RegisterTypes方法中注册

  1. protected override void RegisterTypes(IContainerRegistry containerRegistry)
  2. {
  3. // 弹窗服务的条件:
  4. // 1. 创建的用户控件必须注册成一个弹窗(对话框)
  5. // 2. 一个对话框对应的ViewModel必须实现IDialogAware接口
  6. containerRegistry.RegisterDialog<PageB, PageBViewModel>();
  7. }

3.对话框对应的ViewModel继承IDiaLogAware接口,并实现接口方法

  1. //是否能关闭对话框
  2. public bool CanCloseDialog()
  3. {
  4. return true;
  5. }
  6. //在关闭的时候执行的事件 Parameter参数
  7. public void OnDialogClosed()
  8. {
  9. }
  10. //在窗体打开的时候执行
  11. // IDialogParameters主要负责 接收传递的参数
  12. public void OnDialogOpened(IDialogParameters parameters)
  13. {
  14. }

4.调用弹窗(IDialogService)

        3.1 注入接口IDialogService

        类似于Prism区域设置,同样是使用接口,只不过接口改为 IDialogService--对话服务,同样的将接口注入到构造函数中,目的是为操作 弹框服务 提供的API

  1. private readonly IDialogService dialogService;
  2. // 需要在ViewModel构造函数中注入Prism弹窗服务,目的是操作弹窗服务提供的API.
  3. // IDialogService接口,提供弹窗服务的功能。
  4. public MainViewModel(IDialogService dialogService)
  5. {
  6. OpenCommand2 = new DelegateCommand<string>(Open2);//Delegatecommand
  7. this.dialogService = dialogService;
  8. }

        3.2 在构造函数中通过 IDialogService的Api ShowDialog调用弹窗

  1. public void Open2(string obj)
  2. {
  3. this._dialogService.ShowDialog(obj);
  4. }

3. Prism 的弹窗传参

重点:使用对象DialogParameters传递参数,IDialogParameters负责接收传递的参数,即可向弹窗传参,弹窗关闭时,也可回传参数。

(说白了就是打开弹框时,有参数传进来;关闭时,有参数传出);而在调动弹框的过程中继承接口IDiaLogAware所对应的实现方法中就有对应的打开,关闭事件;

        所以需要考略的就是如何传参?

1.向弹窗传参

        1.1 设置参数 :在哪设置?如何传递?

        既然是向弹窗传参,所以参数自然是从主窗体传参过去的 :DialogParameters

  1. public void Open2(string obj)
  2. {
  3. //打开弹窗之前,可以向弹窗传递参数
  4. //DialogParameters 通过它来传参
  5. DialogParameters dialogParameters = new DialogParameters();
  6. this._dialogService.ShowDialog(obj);
  7. dialogParameters.Add("Title", "我是弹窗标题");
  8. dialogParameters.Add("Content", "我是弹窗内容");
  9. }

        1.2 在窗体打开事件中接收参数 在哪接收?如何接收?

        1.1中参数已经设置好,第二步就是接收主窗体传递的参数;

至于为什么它能接收到参数,因为此方法的参数是接口IDialogParameters,与传参时用的相对应,因此可以接收到

  1. public void OnDialogOpened(IDialogParameters parameters)
  2. {
  3. //先判断parameters中是否有该参数
  4. if (parameters.ContainsKey("Title"))
  5. {
  6. //保存一下
  7. Title = parameters.GetValue<string>("Title");
  8. }
  9. if (parameters.ContainsKey("Content"))
  10. {
  11. Content = parameters.GetValue<string>("Content");
  12. }
  13. }
  14. private string content{get;set;}
  15. public string Content
  16. {
  17. get { return content; }
  18. set { content = value; }
  19. }
  20. private string title;
  21. public string Title
  22. {
  23. get { return title; }
  24. set { title = value; }
  25. }

效果图:视图绑定就不介绍了

2. 窗体关闭,回传参数

        2.1 如同字面意思:参数由弹出窗体传递,主窗体接收;而传递参数也自然是在窗体关闭事件中进行参数设置; 在哪设置?如何传递?

        因为是回传,所以要用到 RequestClose.Invoke

  1. public void OnDialogClosed()
  2. {
  3. // 弹窗关闭时,也可以向来源窗口传递参数。
  4. // 通过DialogResult()传递
  5. DialogParameters parameters = new DialogParameters();
  6. parameters.Add("Name", "张三");
  7. parameters.Add("Age", 20);
  8. RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parameters));
  9. }

        2.2 通过回调来接收关闭时所传的参数 在哪接收?如何接收?

                在打开弹窗的ShowDialog中接收,用 callback来回调接收(callback有传参方法对应的接口);其中dialogParameters是接收窗体返回的结果

  1. // 打开弹窗
  2. this.dialogService.ShowDialog(obj, dialogParameters, (callback) =>
  3. {
  4. // a. 回调函数中可以拿到弹窗返回的结果。
  5. // b. 回调函数中可以拿弹窗传递回来的参数。
  6. // MessageBox.Show(callback.Result.ToString());
  7. if (callback.Result == ButtonResult.OK)
  8. {
  9. string name = string.Empty;
  10. //回调中对应传参方法的接口 Parameters
  11. if (callback.Parameters.ContainsKey("Name")) {
  12. //获取接口中的参数
  13. name = callback.Parameters.GetValue<string>("Name");
  14. }
  15. int age = 0;
  16. if (callback.Parameters.ContainsKey("Age"))
  17. {
  18. age = callback.Parameters.GetValue<int>("Age");
  19. }
  20. MessageBox.Show($"点击了确定按钮!!!接收到的参数:Name:{name},Age:{age}");
  21. }
  22. else
  23. {
  24. MessageBox.Show("点击了取消按钮!!!");
  25. }
  26. });
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/746092
推荐阅读
相关标签
  

闽ICP备14008679号