• WPF Prism8.x源码解析-IDialogService


    点击观看视频

    关于IDialogService

    在Prism中,该接口封装了一组API, 提供了Show/ShowDialog方法, 便于我们在应用程序中灵活的进行弹出窗口进行操作。

    对于Show/ShowDialog方法, 提供了一组参数与回调函数, 允许我们在调用方法前传递参数, 以及处理回调函数的结果与参数, 如下所示

        public interface IDialogService
        {
            void Show(string name, IDialogParameters parameters, Action<IDialogResult> callback);
    
            void Show(string name, IDialogParameters parameters, Action<IDialogResult> callback, string windowName);
    
            void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback);
    
            void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback, string windowName);
        }
    
    • name: 对于弹出窗口在容器当中定义的名称
    • parameters: 一组传递的参数数据
    • callback: 回调方法, 主要用于处理窗口关闭时回传的一组结果

    IDialogAware

    针对需要弹窗的内容,首先,它需要实现IDialogAware接口, 其中包含了关闭事件以及几个用于处理请求的方法, 如下所示:

    • OnDialogOpened: 主要用于接收打开窗口传递过来的参数
    • CanCloseDialog: 验证窗口是否允许被关闭
    • OnDialogClosed: 触发关闭的方法
    • Title: 通用的标题显示
    • RequestClose: 关闭窗口事件,并且传递一个IDialogResult结果

    Show/ShowDialog执行流程

    在IDialogService接口的内部实现中, 大致是创建了一个Window窗口实例,该实例主要用于承载弹窗的内容,并且初始化该Window窗口的事件,
    以及绑定用户控件的IDialoaAware接口的事件(这一步主要用于关联窗口关闭时触发的RequestClose事件)

    下图中, 描述了IDialogService.Show/ShowDialog方法的实现流程。

    那么, 我们大致明白了, 其内部主要是初始化了一个Window窗口, 最终Show/ShowDialog弹出。
    关于IDialogAware接口, 只是在Window窗口内部进行绑定了事件, 在合适的时机进行触发。
    注: 因为我们知道, 对于一个Window窗口, 他具备Loaded、Closing等事件。

    对于用户控件实现IDialogAware接口的OnDialogOpened方法, 允许接受IDialogParameters的参数对象, 其中则是一组字典集合的对象, 我们可以在内部取出我们传递
    的所有参数结果。

    IDialogParameters

    该接口围绕着字典维护了一组方法, 允许我们在取出结果之前, 判断对应的结果是否存在, 以及获取结果的方法, 如下所示:

        public interface IDialogParameters
        {
            void Add(string key, object value);
    
            bool ContainsKey(string key);
    
            int Count { get; }
    
            IEnumerable<string> Keys { get; }
    
            T GetValue<T>(string key);
    
            IEnumerable<T> GetValues<T>(string key);
    
            bool TryGetValue<T>(string key, out T value);
        }
    

    IDialogResult

    该接口主要用于关闭窗口时, 回传的一组结果,已经回调的数据。

        public interface IDialogResult
        {
            IDialogParameters Parameters { get; }
    
            ButtonResult Result { get; }
        }
    
    • Parameters : 如上面解释, 一组key/value的结果
    • Result: 一个判断窗口处理结果的枚举类型

    示例

    下面演示了如何使用IDialogService接口进行调用弹出窗口:

            private void ShowDialog()
            {
                var p = new DialogParameters();
                p.Add("message", "Hello from ViewAViewModel");
    
                _dialogService.ShowDialog("MessageDialog", p, r =>
                {
                    if (r.Result == ButtonResult.OK)
                    {
                        MessageReceived = r.Parameters.GetValue<string>("myParam");
                    }
                    else
                    {
                        MessageReceived = "Not closed by user";
                    }
                });
            }
    

    注: 上面的代码中, 我们首先创建了一个对话的参数对象, 添加了一个名为message的数据。并且在调用ShowDialog的时候将它传递过去。
    同时, 在后面追加了一个回调函数, 用于处理回传的结果以及回传的参数数据。

    • Result: 判断回传的结果
    • MessageReceived: 接受一个名为myParam的string类型数据。

    对于弹出窗口的业务代码, 如下所示:

           private void CloseDialog()
            {
                var buttonResult = ButtonResult.OK;
    
                var parameters = new DialogParameters();
                parameters.Add("myParam", "The Dialog was closed by the user.");
                RequestClose?.Invoke(new DialogResult(buttonResult, parameters));
            }
    
            public void OnDialogOpened(IDialogParameters parameters)
            {
                Message = parameters.GetValue<string>("message");
            }
    
    • OnDialogOpened: 接收名为message的string类型的结果, 用Message属性接收
    • CloseDialog: 创建用于返回的结果已经回传的数据, 调用RequestClose事件,并且将结果传递回传
  • 相关阅读:
    vue 爬坑之路---设置背景图,不能resolve编译
    vue 爬坑之路----flexible.js不适配ipad和ipad pro
    vue-cli3 vue.config.js配置
    vue组件
    Vue 路由按需keep-alive
    vue-cli项目搭建
    http和https
    js时间戳和日期互转换
    vue补充
    js实现头像上传(移动端,PC端均可)
  • 原文地址:https://www.cnblogs.com/zh7791/p/14320463.html
Copyright © 2020-2023  润新知