點擊觀看視頻
關於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事件,並且將結果傳遞回傳