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事件,并且将结果传递回传
原文地址:https://www.cnblogs.com/zh7791/p/14320463.html