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事件,並且將結果傳遞回傳


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM