(二十)自定义对话服务

之前的弹窗是不合符要求的,想要使用md的组件和prism的对话服务

1. 看源码怎么写

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类型

     }
 }
  • 注册
    image

3. 重写model层

  • 更换接口IDialogHostAware
  • indexviewmodel中修改参数
    image
    image
  • mainview的identifier修改位Root,弹出窗口在这个页面中呈现
  • 弹出窗绑定取消和确定命令
    image
  • 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)
        {
        }
posted @ 2023-10-12 13:09  huihui不会写代码  阅读(189)  评论(0)    收藏  举报