点击观看视频
关于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事件,并且将结果传递回传