Wpf 使用 Prism 实战开发Day23

news2025/1/24 15:53:05

自定义对话框服务

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

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

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 主窗口上面显示 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

真实案例分享,终端pc直接telnet不到出口路由器。

1、背景信息 我终端pc的网卡地址获取的网关是在核心交换机上&#xff0c;在核心交换机上telnet出口路由器可以实现。 所有终端网段都不能telnet出口路由器&#xff0c;客户希望能用最小的影响方式进行解决。 2、现有配置信息 终端的无线和有线分别在两个网段中&#xff0c;…

案例题(第一版)

案例题目 软件架构设计考点&#xff08;历年必考&#xff09; 软件架构设计通常在每年的第一题&#xff0c;该题必考 必备概念 必备概念即考试必须要默写出来的概念 概念描述软件架构风格是指描述特定软件系统组织方式和惯用模式。组织方式描述了系统的组成构件和这些构件的组…

从“图形可视化”到“图生代码”,低代码平台的新挑战

前言&#xff1a; 低代码平台最大的一个特点就是可视化&#xff0c;将代码采用可视化的方式展示管理。一时间拥有图形化界面的各类系统都挂上了低代码的标签。但更多的代码从业者在使用中却发现&#xff0c;在众多的低代码平台中都是“别人家的代码”其可视化主要是别人家的代…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.1,2 讲 I2C驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)

角色菜单 相关组件方法效果图MySQL代码实现资源菜单树组件实现权限树方法js这里我先主要实现权限树的整体实现方法&#xff0c;如果是直接查看使用的话可以只看这里&#xff01; 后端代码Controlle层代码Service代码及实现类代码Service代码ServiceImpl代码 resourceMapper 代码…

指数分布的理解,推导与应用

指数分布的定义 在浙大版的教材中&#xff0c;指数分布的定义如下&#xff1a; 若连续型的随机变量 X X X的概率密度为&#xff1a; f ( x ) { 1 θ e − x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

Jenkins 构建 Web 项目:构建服务器和部署服务器分离的情况

构建命令 #!/bin/bash node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist

BLE学习笔记(0.0) —— 基础概念(0)

前言 &#xff08;1&#xff09;本章节主要是对BLE技术进行简单的介绍&#xff0c;熟悉蓝牙技术的发展过程&#xff0c;了解相关术语方便后续的学习。 &#xff08;2&#xff09;为了防止单篇博客太长以至于看不下去&#xff0c;因此我基础概念章节分为两篇来写。 &#xff08;…

创新指南|利用电商产品视频进行渠道营销的最佳策略,不断提升销售额

无论企业的利基市场如何&#xff0c;电商产品视频都已被证明是非常可靠的资产&#xff0c;可以让目标受众了解您所提供的产品——关键功能、展示重要的差异化优势甚至改变大多数营销活动的游戏规则。阅读本文&#xff0c;全面了解电商产品视频如何融入营销推广&#xff0c;以最…

IDEA 自定义注解(类注释、方法注释)

一、生成类注释 1、打开设置位置 打开File —> Settings —> Editor —> File and Code Templates —> Files —> Class 2、将自定义的类注解规则&#xff0c;复制到Class中。 /** * * 功能: * * 作者: 暗自着迷 * * 日期: ${YEAR}-${MONTH}-${DAY} ${HOU…

AI图片过拟合如何处理?答案就在其中!

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答8 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

头歌openGauss-存储过程第2关:修改存储过程

任务描述 本关任务&#xff1a; 修改存储过程pro0101&#xff0c;并调用&#xff1b; --修改sel_course表中成绩<60的记录为成绩10&#xff0c;然后将计算机学院所有学生的选课成绩输出&#xff1b; --a、需要先删除存储过程pro0101&#xff1b; drop procedure if exists p…

JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率

计算两个字符串之间的重复率 最长公共子序列实现代码 最长公共子序列 基于最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;的重复率的中心逻辑是首先找到两个或多个序列中同时出现的、不一定连续但保持相对顺序的最长子序列&#xff0c;然后计算这个最…

5款AI工具,PS插件的智能升级

在Photoshop插件的世界里&#xff0c;创新和效率是永远的主题。随着AI技术的融入&#xff0c;传统的PS插件正在经历一场革命。本文将介绍五款结合了人工智能技术的PS插件&#xff0c;它们不仅提升了设计工作的效率&#xff0c;还拓展了创意的边界。 StartAI —— 智能设计的未来…

【因果推断从入门到精通二】随机实验3

目录 检验无因果效应假说 硬币投掷的特殊性何在&#xff1f; 检验无因果效应假说 无因果效应假说认为&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治疗而不是ZMapp与此无关。在174例接受mAb14治疗的患者中&#xff0c;113/17464.9%存活了28天&…

画图工具之PlantUML插件使用

文章目录 1 PlantUML插件1.1 引言1.2 什么是PlantUML1.3 PlantUML插件1.3.1 IntelliJ IDEA中插件1.3.2 VS Code中插件1.3.3 使用例子 1.4 PlantUML时序图语法1.4.1 声明参与者1.4.2 消息传递1.4.2.1 同步消息1.4.2.2 异步消息1.4.2.3 返回消息1.4.2.4 自调用 1.4.3 生命线&…

字符函数:分类函数与转换函数

字符函数 一.字符分类函数二.字符转换函数 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了一系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 一.字符分类函数 C语言中有⼀系列的函数是专门…

基于python向量机算法的数据分析与预测

3.1 数据来源信息 该数据集来源于Kaggle网站&#xff0c;数据集中包含了罗平菜籽油的销售数据&#xff0c;每行数据对应一条记录&#xff0c;记录了罗平菜籽油销售数据。其中&#xff0c;菜籽产量、菜籽价格和菜籽油价格是数值型数据&#xff0c;共2486条数据。 通过读取Exce…

大模型日报|今日必读的 13 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.MIT新研究&#xff1a;并非所有语言模型特征都是线性的 最近的研究提出了线性表征假说&#xff1a;语言模型通过操作激活空间中概念&#xff08;“特征”&#xff09;的一维表征来执行计算。与此相反&#xff0c;来…

现代密码学——消息认证和哈希函数

1.概述 1.加密-->被动攻击&#xff08;获取消息内容、业务流分析&#xff09; 消息认证和数字签名-->主动攻击&#xff08;假冒、重放、篡改、业务拒绝&#xff09; 2.消息认证作用&#xff1a; 验证消息源的真实性&#xff0c; 消息的完整性&#xff08;未被篡改…