Wpf 使用 Prism 实战开发Day23

自定义对话框服务

当原有对话框不能满足需求的时候,可以通过自定义对话框来实现特殊的需求

一.自定义对话框主机服务步骤:

1.建立一个IDialogHostService 接口类,继承自 IDialogService 对话框服务类。并且自定义基类的服务方法。

public interface IDialogHostService:IDialogService
{
    Task<IDialogResult> ShowDialog(string name,IDialogParameters parameters,string dialogHostName="Root");
}

2.创建一个 IDialogHostAware 接口类

    public interface IDialogHostAware
    {
        //Dialoghost 名称
        string DialogHostName { get; set; }

        //打开窗口过程中所接收的参数
        void OnDialogOpend(IDialogParameters parameters);
        //取消命令
        DelegateCommand CancelCommand { get; set; }
        //保存命令
        DelegateCommand SaveCommand { get; set; }

    }

2.接着,实现基类自定义主机服务的方法

/// <summary>
/// 自定义对话主机服务
/// </summary>
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();
        //从容器中取出弹出窗口的实例
        var content=  _containerExtension.Resolve<object>(name);
        //验证实例有效性
        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;
        //打开过程中,所执行的事件
        DialogOpenedEventHandler eventHandle = (sender, args) =>
        {
            if (viewModel is IDialogHostAware aware)
            {
                aware.OnDialogOpend(parameters);
            }
            args.Session.UpdateContent(content);
        };
       return (IDialogResult) await DialogHost.Show(dialogContent, viewModel.DialogHostName, eventHandle);
    }
}

二.把对话框主机服务,进行依赖注册。

containerRegistry.Register<IDialogHostService, DialogHostService>();

三.修改ViewModels 中Dialog 文件夹中待办事项和备忘录弹窗视图继承逻辑

1.修改 AddToDoViewModel后台处理逻辑类继承自IDialogHostAware

 public class AddToDoViewModel : IDialogHostAware
 {
     public AddToDoViewModel()
     {
         CancelCommand = new DelegateCommand(Cancel);
         SaveCommand = new DelegateCommand(Save);
     }

     public string DialogHostName { get; set; }
     public DelegateCommand CancelCommand { get; set; }
     public DelegateCommand SaveCommand { get; set; }

     public void OnDialogOpend(IDialogParameters parameters)
     {

     }
     private void Cancel()
     {
         if (DialogHost.IsDialogOpen(DialogHostName)) //是否是打开
         {
             DialogHost.Close(DialogHostName,new DialogResult(ButtonResult.No)); //关闭
         }
     }
     private void Save()
     {
         if (DialogHost.IsDialogOpen(DialogHostName)) //是否是打开
         {
             DialogParameters pairs = new DialogParameters(); //定义返回参数
             DialogHost.Close(DialogHostName, new DialogResult(ButtonResult.OK, pairs));
         }
     }

 }

2.修改 AddMemoViewModel 后台处理逻辑类继承自IDialogHostAware

public class AddMemoViewModel : IDialogHostAware
{
    public AddMemoViewModel()
    {
        CancelCommand = new DelegateCommand(Cancel);
        SaveCommand = new DelegateCommand(Save);
    }

    public string DialogHostName { get; set; }
    public DelegateCommand CancelCommand { get; set; }
    public DelegateCommand SaveCommand { get; set; }

    public void OnDialogOpend(IDialogParameters parameters)
    {
       
    }
    private void Cancel()
    {
        if (DialogHost.IsDialogOpen(DialogHostName)) //是否是打开
        {
            DialogHost.Close(DialogHostName,new DialogResult(ButtonResult.No)); //关闭
        }   
    }
    private void Save()
    {
        if (DialogHost.IsDialogOpen(DialogHostName)) //是否是打开
        {
            DialogParameters pairs = new DialogParameters(); //定义返回参数
            DialogHost.Close(DialogHostName,new DialogResult (ButtonResult.OK,pairs)); 
        }
    }

}

3.修改弹窗视图 待办事项和备忘录,给按钮添加命令绑定

4.最后再修改原弹窗注册服务,直接添加进容器中即可。

四. 修改 IndexViewModel 处理逻辑

public class IndexViewModel:BindableBase
{
    public IndexViewModel(IDialogHostService dialogService)
    {
        TaskBars=new ObservableCollection<TaskBar>();
        ToDoDtos = new ObservableCollection<ToDoDto>();
        MemoDtos = new ObservableCollection<MemoDto>();
        ExecuteCommand = new DelegateCommand<string>(Execute);
        CreateTaskBars();
        CreateTestDate();
        this.dialogService = dialogService;
    }

    public DelegateCommand<string> ExecuteCommand { get; private set; }
        
    private ObservableCollection<TaskBar> taskBars;

    public ObservableCollection<TaskBar> TaskBars
    {
        get { return taskBars; }
        set { taskBars = value; RaisePropertyChanged(); }
    }
    private ObservableCollection<ToDoDto> toDoDtos;

    public ObservableCollection<ToDoDto> ToDoDtos
    {
        get { return toDoDtos; }
        set { toDoDtos = value; RaisePropertyChanged(); }
    }
    private ObservableCollection<MemoDto> memoDtos;
    private readonly IDialogHostService dialogService;

    public ObservableCollection<MemoDto> MemoDtos
    {
        get { return memoDtos; }
        set { memoDtos = value; RaisePropertyChanged(); }
    }
    void CreateTaskBars()
    {
        TaskBars.Add(new TaskBar() { Icon="ClockFast",Title="汇总",Content="9",Color="#FF0CA0FF",Target=""});
        TaskBars.Add(new TaskBar() { Icon = "ClockCheckOutline", Title = "已完成", Content = "9", Color = "#FF1ECA3A", Target = "" });
        TaskBars.Add(new TaskBar() { Icon = "ChartLineVariant", Title = "完成比例", Content = "9%", Color = "#FF02C6DC", Target = "" });
        TaskBars.Add(new TaskBar() { Icon = "PlaylistStar", Title = "备忘录", Content = "18", Color = "#FFFFA000", Target = "" });
    }
    void CreateTestDate()
    {
        
        for (int i = 0; i < 10; i++)
        {
            ToDoDtos.Add(new ToDoDto { Title="待办"+i,Content="正在处理中.."});
            MemoDtos.Add(new MemoDto { Title = "备忘" + i, Content = "我的密码" });
        }
    }
    private void Execute(string obj)
    {
       switch(obj)
        {
            case "新增备忘录":
                dialogService.ShowDialog("AddMemoView",null, "RootDialog");
                break;
            case "新增待办事项":
                dialogService.ShowDialog("AddToDoView",null, "RootDialog");
                break;
        }
    }
}

1.由于主窗口,有一个Identifier 的名称叫 RootDialog

2.所以修改 IndexViewModel 中弹窗逻辑,传过去的名称就叫RootDialog,即表示所有的弹窗,都会在 MainView 主窗口上面显示 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/639250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sh控制台输入文字多行 按“# ꧂ ꧁”结束

如果在Unix shell中输入多行文字&#xff0c;那么这样操作&#xff1a; 1. 打开您的终端&#xff08;Terminal&#xff09;。 2. 输入您的文字&#xff0c;每行文字后按回车键。 3. 当您完成输入所有文字后&#xff0c;输入“# ꧂ ꧁”然后按回车键&#xff0c;表示输入结束。…

海外私人IP和原生IP有什么区别,谁更有优势?

一、什么是海外私人IP&#xff1f;什么是原生IP&#xff1f; 1、海外私人IP&#xff1a; 海外私人IP是由专门的服务提供商提供的IP地址&#xff0c;这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP访问特定国家或地区的网站&am…

【golang】内存对齐

什么是内存对齐 在访问特定类型变量的时候通常在特定的内存地址访问&#xff0c;这就需要对这些数据在内存中存放的位置有限制&#xff0c;各种类型数据按照一定的规则在空间上排列&#xff0c;而不是顺序的一个接一个的排放&#xff0c;这就是对齐。 内存对齐是编译器的管辖…

2024 年 5 种领先的小语言模型:Phi 3、Llama 3 等

2024 年 5 种领先的小语言模型&#xff1a;Phi 3、Llama 3 等 近年来&#xff0c;GPT-3 和 BERT 等大型语言模型的发展改变了人工智能的格局&#xff0c;它们以其强大的功能和广泛的应用而闻名。 然而&#xff0c;除了这些巨头之外&#xff0c;一种新的 AI 工具类别也正在掀起…

平板如何实现无纸化会议

为了实现高效的无纸化会议&#xff0c;连通宝可以是在内部网络部署&#xff0c;那么&#xff0c;平板如何实现无纸化会议&#xff1f; 1. 服务器配置&#xff1a; 部署专用无纸化会议系统服务器&#xff08;如rhub无纸化会议服务器&#xff09;至组织的内部网络中。确保该服务…

[论文笔记]REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

引言 今天带来一篇经典论文REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS的阅读笔记&#xff0c;论文中文意思是 在语言模型中协同推理和行动。 虽然大型语言模型(LLMs)在语言理解和互动决策任务中展现出强大的能力&#xff0c;但它们在推理(例如思维链提示)和…

【计算机毕业设计】基于SSM++jsp的实验室耗材管理系统【源码+lw+部署文档】

目录 第1章 绪论 1.1 课题背景 1.2 课题意义 1.3 研究内容 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 JSP技术 2.3 SSM框架 第3章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信息流…

0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKB方案

大纲 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper测试代码代码 在《0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案》中&#xff0c;我们介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…

B站自动回复插件_无需千粉,轻松适配引流拉新资源分享

项目介绍 B站关键词自动回复插件&#xff0c;无需千粉&#xff0c; 很适合做流量做引流做私欲的朋友&#xff0c; 前期没有千粉是无法开启官方自动回复的&#xff0c; 适当的情况下可以用这个插件顶一下&#xff0c; 三联好评领取资源的打法真的超级涨粉&#xff0c; 感谢插件…

YOLOv5改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在YOLOv5的GFLOPs计算量中&#xff0c;卷积占了其中大多数的比列&#xff0c;为了减少计算量&#xff0c;研究人员提出了用EfficientNet代替b…

霍启刚弟弟求婚成功❗霍启仁豪门家族地位与爱情如何抉择?

霍启刚的弟弟霍启仁在社交媒体上宣布求婚成功 他与泰国女友在浪漫的船上场景中 单膝下跪为她戴上象征爱情的戒指 两人紧紧相握的双手&#xff0c;在镜头前展现了无尽的甜蜜与温馨 霍启仁&#xff0c;出生于1988年10月12日 是香港特别行政区立法会议员霍震霆与朱玲玲的第三个…

pytorch-13_2 模型结构选择策略:层数、激活函数、神经元个数

一、拟合度概念 在所有的模型优化问题中&#xff0c;最基础的也是最核心的问题&#xff0c;就是关于模型拟合程度的探讨与优化。根据此前的讨论&#xff0c;模型如果能很好的捕捉总体规律&#xff0c;就能够有较好的未知数据的预测效果。但限制模型捕捉总体规律的原因主要有两点…

CAD怎么画角度?介绍三种具体操作

CAD怎么画角度&#xff1f;在现代设计与制造领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件的存在极大地提高了设计师和工程师的工作效率。在CAD软件中&#xff0c;绘制角度是一项基础而重要的技能&#xff0c;它广泛应用于机械设计、建筑设计、电子电路布局等…

WPF水流动画(使用转换器模拟逻辑门控制水流信号)

前言 在使用WPF绘制流程图并模拟水流动画时&#xff0c;往往既需要控制阀泵的开合&#xff0c;又要控制动画启停。倘若能够将阀泵的开合与动画播放建立逻辑关系&#xff0c;这样就能够让业务代码“专心”地去控制阀泵开关&#xff0c;而不需要处理界面的展示。 动画示例 说明…

【设计模式深度剖析】【5】【创建型】【原型模式】| 类比群发邮件,加深理解

&#x1f448;️上一篇:建造者模式 | 下一篇:创建型设计模式对比&#x1f449;️ 目录 原型模式(Prototype Pattern)概览定义英文原话直译 3个角色类图1. 抽象原型&#xff08;Prototype&#xff09;角色2. 具体原型&#xff08;Concrete Prototype&#xff09;角色3. 客户…

Upstream最新发布2024年汽车网络安全报告-百度网盘下载

Upstream最新发布2024年汽车网络安全报告-百度网盘下载 2024年2月7日&#xff0c;Upstream Security发布了2024年Upstream《GLOBAL AUTOMOTIVE CYBERSECURITY REPORT》。这份报告的第六版着重介绍了汽车网络安全的拐点&#xff1a;从实验性的黑客攻击发展到规模庞大的攻击&…

【文心智能体】创建一个属于自己的生活情感类智能体

文章目录 前言一、创建智能体二、体验 前言 智能体技术的快速发展&#xff0c;进一步激发了各行业开发者对其实际应用及用户需求的深入探索。 创建一个属于自己的智能体。文心一言提供了一个很好的平台。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

“智”造产业新生态,2024SIA上海自动化展会乘势而来!

今年两会&#xff0c;我们频频听到一个热词“新质生产力”。当前&#xff0c;“加快形成新质生产力”已成为实体经济创新发展的具体指向。如何在加快形成新质生产力的新赛道上快马加鞭&#xff0c;成为下一个时代的领跑者&#xff0c;是制造业亟需面临的思考题。 在良好的市场环…

---随笔--Redis的学习以及在Spring Boot中的整合使用(RedisTemplate、Redisson分布式锁)

---随笔--Redis的学习以及在Spring Boot中的整合使用&#xff08;RedisTemplate、Redisson分布式锁&#xff09; 引言1. 什么是Redis2. Redis的数据结构3. Redis其它常用命令4. 小插曲之Redis面试常考5. 正篇&#xff1a;Redis在Spring Boot中的使用&#xff01;&#xff08;着…

NE555+74ls160+74LS20数电数字钟Multisim仿真设计

设计框图 数字钟电路的基本组成框架图如图一所示&#xff0c;它主要由多谐振荡器、计数器、译码器和数码显示器4个部分组成。 图一 数字钟电路的基本组成&#xff08;方框图&#xff09; 2、设计方案 数字钟是一个将“时”&#xff0c;“分”&#xff0c;“秒”显示于人的视…