(二十)自定义对话服务
之前的弹窗是不合符要求的,想要使用md的组件和prism的对话服务
1. 看源码怎么写
- prism源码对话服务类位置
https://github.com/PrismLibrary/Prism/tree/master/src
- 查看DialogService 的showdialog方法是怎么用的
2.自定义对话服务
- 自己定义接口在common包
public interface IDialogHostService:IDialogService
{
Task<IDialogResult> ShowDialog(string name,IDialogParameters parameters,string dialogHostName="Root");
}
- 写接口的实现,把对话服务的逻辑单独写,弹窗model继承
public interface IDialogHostAware
{
//顶级节点,IDialogHost的名字,binding时需要他的名称
string DialogHostName { get; set; }
//打开过程中执行
void OnDialogOpend(IDialogParameters parameters);
DelegateCommand SaveCommand { get; set; }//保存命令
DelegateCommand CancelCommand { get; set; }//取消命令
}
- 写IDialogHostService实现
//对话主机服务自定义的 DialogService是prism的
public class DialogHostService : DialogService, IDialogHostService
{
private readonly IContainerExtension containerExtension;
public DialogHostService(IContainerExtension containerExtension) : base(containerExtension)
{
this.containerExtension = containerExtension;//本身可以接收这个容器做一些事情
}
public async Task<IDialogResult> ShowDialog(string name, IDialogParameters parameters, string dialogHostName = "Root")
{
parameters ??= new DialogParameters();
//1.等同于这种写法
// if(parameters == null) parameters= new DialogParameters();
//2.IDialogWindow dialogWindow = CreateDialogWindow(windowName);
//直接写CreateDialogWindow的返回值
//从容器当中取出弹出窗口的实例(获取窗口对象)
var content = containerExtension.Resolve<object>(name);
//3.ConfigureDialogWindowContent(name, dialogWindow, parameters);
//直接找这个方法看逻辑判断拿过来
//验证实例的有效性
if (!(content is FrameworkElement dialogContent))
throw new NullReferenceException("A dialog's content must be a FrameworkElement");
//是不是自动设置上下文
if (dialogContent is FrameworkElement view && view.DataContext is null && ViewModelLocator.GetAutoWireViewModel(view) is null)
{
ViewModelLocator.SetAutoWireViewModel(view, true);
}
//是不是接口
if (!(dialogContent.DataContext is IDialogHostAware viewModel))
throw new NullReferenceException("A dialog's ViewModel must implement the IDialogAware interface");
viewModel.DialogHostName = dialogHostName;
//md当中带的DialogOpenedEventHandler,窗口打开 过程会执行一个事件
DialogOpenedEventHandler eventHandler = (sender, EventArgs) =>
{
if(viewModel is IDialogHostAware aware)
{
aware.OnDialogOpend(parameters);//记得看参数里面到底有啥
}
EventArgs.Session.UpdateContent(content);//更新当前窗口的值
};
return (IDialogResult)await DialogHost.Show(dialogContent, viewModel.DialogHostName, eventHandler);//Show会接收一个object类型
}
}
- 注册
3. 重写model层
- 更换接口IDialogHostAware
- indexviewmodel中修改参数
- mainview的identifier修改位Root,弹出窗口在这个页面中呈现
- 弹出窗绑定取消和确定命令
- model的修改
public AddMemoViewModel()
{
SaveCommand = new DelegateCommand(Save);
CancelCommand = new DelegateCommand(Cancel);
}
private void Cancel()
{
if(DialogHost.IsDialogOpen(DialogHostName))
DialogHost.Close(DialogHostName);
}
private void Save()
{
if (DialogHost.IsDialogOpen(DialogHostName))
{
DialogParameters param=new DialogParameters();
DialogHost.Close(DialogHostName,new DialogResult(ButtonResult.OK,param));
}
}
public string DialogHostName { get; set; }
public DelegateCommand SaveCommand { get; set; }
public DelegateCommand CancelCommand { get; set; }
public void OnDialogOpend(IDialogParameters parameters)
{
}