WPF实战学习笔记22-添加自定义询问窗口
添加自定义询问窗口
详细代码:https://github.com/DongLiqiang/Mytodo/commit/221de6b2344d5c861f1d3b2fbb2480e3e3b35c26
添加自定义询问窗口显示方法
修改文件Mytodo.Extensions.DialogExtension
添加内容,类中添加内容
/// <summary>
/// 显示方法
/// </summary>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <param name="dialogHostName"></param>
/// <returns></returns>
public static async Task<IDialogResult> Question(this IDialogHostService dialogHost,string Title, string Content, string dialogHostName = "Root")
{DialogParameters param = new DialogParameters();//添加参数param.Add("Title", Title);param.Add("Content", Content);param.Add("DialogHostName", dialogHostName);//返回对话框实例return await dialogHost.ShowDialog("MsgView",param, dialogHostName);
}
自定义窗体
自定义界面
添加文件Mytodo.Views.MsgView.xaml
<UserControlx:Class="Mytodo.Views.MsgView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:Mytodo.ViewModels"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"d:DesignHeight="450"d:DesignWidth="800"mc:Ignorable="d"><Grid><Grid.RowDefinitions><RowDefinition Height="auto" /><RowDefinition /><RowDefinition Height="auto" /></Grid.RowDefinitions><TextBlockPadding="5"d:Text="温馨提示"FontSize="14"Text="{Binding Title}" /><TextBlockGrid.Row="1"Padding="15,0"VerticalAlignment="Center"d:Text="确认删除该数据吗?"FontSize="14"Text="{Binding Content}" /><StackPanelGrid.Row="2"Margin="10"HorizontalAlignment="Right"Orientation="Horizontal"><ButtonMargin="0,0,10,0"Command="{Binding CancelCommand}"Content="取消"Style="{StaticResource MaterialDesignOutlinedButton}" /><Button Command="{Binding SaveCommand}" Content="确定" /></StackPanel></Grid>
</UserControl>
添加窗体模型
添加文件:Mytodo.ViewModels.MsgViewModel
using MaterialDesignThemes.Wpf;
using Mytodo.Dialog;
using MyToDo.Share.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Mytodo.ViewModels
{class MsgViewModel: BindableBase, IDialogHostAware{#region 命令定义#endregion#region 属性定义/// <summary>/// 对话框内容/// </summary>public string Content{get { return content; }set { content = value; }}/// <summary>/// 对话框标题 /// </summary>public string Title{get { return title; }set { title = value; }}#endregion#region 重要字段定义#endregion#region 字段定义private string content;private string title;#endregionpublic MsgViewModel(){SaveCommand = new DelegateCommand(Save);CancelCommand = new DelegateCommand(Cancel);}/// <summary>/// 取消/// </summary>private void Cancel(){if (DialogHost.IsDialogOpen(DialogHostName))DialogHost.Close(DialogHostName, new DialogResult(ButtonResult.No)); //取消返回NO告诉操作结束}/// <summary>/// 确定/// </summary>private void Save(){if (DialogHost.IsDialogOpen(DialogHostName)){//确定时,把编辑的实体返回并且返回OKDialogParameters 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){//获取Titleif (parameters.ContainsKey("Title"))Title = parameters.GetValue<string>("Title");//获取Contentif (parameters.ContainsKey("Content"))Content = parameters.GetValue<string>("Content");}}
}
依赖注入
修改:App.xaml.cs
RegisterTypes函数添加
containerRegistry.RegisterForNavigation<MsgView, MsgViewModel>();
使用
主界面
修改文件:Mytodo.Views.MainView.cs
修改为
using Mytodo.Common.Events;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Prism.Events;
using Mytodo.Extensions;
using MaterialDesignThemes.Wpf;
using Mytodo.Dialog;
using Prism.Ioc;namespace Mytodo.Views
{/// <summary>/// MainView.xaml 的交互逻辑/// </summary>public partial class MainView : Window{ private readonly IDialogHostService dialoghost;/// <summary>/// 订阅消息/// </summary>public MainView(IEventAggregator aggregator,IContainerProvider provider){//检索实例dialoghost= provider.Resolve<IDialogHostService>();aggregator.Register(arg =>{DialogHost.IsOpen = arg.IsOpen;if (DialogHost.IsOpen)DialogHost.DialogContent = new ProgressView();});InitializeComponent();menuBar.SelectionChanged += (s, e) =>{drawerHost.IsLeftDrawerOpen = false;};btnclo.Click += async (s, e) =>{//展开确认对话框var queres = await DialogExtension.Question(dialoghost, "温馨提示", $"是否要关闭此程序?");if (queres.Result != Prism.Services.Dialogs.ButtonResult.OK) return;this.Close();};btnmin.Click += (s, e) =>{this.WindowState = WindowState.Minimized;};btnmax.Click += (s, e) =>{this.WindowState = WindowState.Maximized;};ColorZone.MouseMove += (s, e) =>{if (e.LeftButton == MouseButtonState.Pressed)this.DragMove();};ColorZone.MouseDoubleClick += (s, e) =>{if (WindowState != WindowState.Normal)WindowState = WindowState.Normal;elseWindowState = WindowState.Maximized;};}}
}
待办
修改文件Mytodo.ViewModels.TodoViewModel.cs
添加内容
private readonly IDialogHostService dialoghost;
修改内容:
public TodoViewModel(ITodoService service,IContainerProvider provider) : base(provider)
{//检索对话框的实例dialoghost = provider.Resolve<DialogHostService>();//初始化对象TodoDtos = new ObservableCollection<ToDoDto>(); RightContentTitle = "添加血雨待办";//初始化命令SelectedCommand = new DelegateCommand<ToDoDto>(Selected);OpenRightContentCmd = new DelegateCommand(Add);ExecuteCommand = new DelegateCommand<string>(ExceuteCmd);DeleteCommand = new DelegateCommand<ToDoDto>(DeleteItem);this.service = service;
}
/// <summary>
/// 删除指定项
/// </summary>
/// <param name="dto"></param>
async private void DeleteItem(ToDoDto dto)
{//展开确认对话框var queres = await DialogExtension.Question(dialoghost, "温馨提示", $"是否要删除此项?{dto.Title}?");if (queres.Result != Prism.Services.Dialogs.ButtonResult.OK) return;var delres = await service.DeleteAsync(dto.Id);if (delres.Status){var model = TodoDtos.FirstOrDefault(t => t.Id.Equals(dto.Id));TodoDtos.Remove(dto);}
}
备忘录
修改文件Mytodo.ViewModels.MemoViewModel.cs
添加内容
private readonly IDialogHostService dialoghost;
修改内容
/// <summary>
/// 删除指定项
/// </summary>
/// <param name="dto"></param>
async private void DeleteItem(MemoDto dto)
{//展开确认对话框var queres = await DialogExtension.Question(dialoghost,"温馨提示",$"是否要删除此项?{dto.Title}?");if (queres.Result != Prism.Services.Dialogs.ButtonResult.OK) return;var delres = await service.DeleteAsync(dto.Id);if (delres.Status){var model = MemoDtos.FirstOrDefault(t => t.Id.Equals(dto.Id));MemoDtos.Remove(dto);}
}
public MemoViewModel(IMemoService service, IContainerProvider provider) : base(provider)
{//初始化对象MemoDtos = new ObservableCollection<MemoDto>();RightContentTitle = "添加备忘率";//初始化命令SelectedCommand = new DelegateCommand<MemoDto>(Selected);OpenRightContentCmd = new DelegateCommand(Add);ExecuteCommand = new DelegateCommand<string>(ExceuteCmd);DeleteCommand = new DelegateCommand<MemoDto>(DeleteItem);//检索DialogHostService类型的实例dialoghost = provider.Resolve<DialogHostService>();this.service = service;
}
相关文章:
WPF实战学习笔记22-添加自定义询问窗口
添加自定义询问窗口 详细代码:https://github.com/DongLiqiang/Mytodo/commit/221de6b2344d5c861f1d3b2fbb2480e3e3b35c26 添加自定义询问窗口显示方法 修改文件Mytodo.Extensions.DialogExtension 添加内容,类中添加内容 /// <summary> /// …...
Spring Boot项目的创建
hi 大家好,又见面了,今天继续讲解Spring Boot 文章目录 🐶1.什么是Spring Boot?🐶2.Spring Boot的优势🐶3.Spring Boot项目创建🌼3.1使用ieda创建🥝3.1.1下载插件Spring Boot Helper🥝3.1.2创建项目 &…...
Python加载数据的5种方法
大家好,今天回顾五种引入数据的Python技术,并附有代码实例参考。 我们将使用Numpy、Pandas和Pickle包,所以要导入它们: import numpy as np import pandas as pd import pickle Manual功能 这是最困难的,因为你必须…...
QPoint、QLine、QSize、QRect
QPoint、QLine、QSize、QRect QPointQLineQSizeQRect QPoint // 构造函数 // 构造一个坐标原点, 即(0, 0) QPoint::QPoint(); // 参数为 x轴坐标, y轴坐标 QPoint::QPoint(int xpos, int ypos);// 设置x轴坐标 void QPoint::setX(int x); // 设置y轴坐标 void QPoint::setY(in…...
vue+leaflet笔记之地图量测
vueleaflet笔记之地图量测 文章目录 vueleaflet笔记之地图量测开发环境代码简介插件简介与安装使用简介图形量测动态量测 详细源码(Vue3) 本文介绍了Web端使用Leaflet开发库进行距离量测的一种方法 (底图来源:天地图),结合leaflet-measure-path插件能够快速的实现地…...
“深入理解SpringBoot:从入门到精通的几个关键要点“
标题:深入理解Spring Boot:从入门到精通 摘要:本文将深入探讨Spring Boot的关键要点,帮助读者从入门到精通。我们将从Spring Boot的基本概念开始,介绍自动配置、起步依赖、注解驱动开发等特性,并通过示例代…...
数值线性代数: 共轭梯度法
本文总结线性方程组求解的相关算法,特别是共轭梯度法的原理及流程。 零、预修 0.1 LU分解 设,若对于,均有,则存在下三角矩阵和上三角矩阵,使得。 设,若对于,均有,则存在唯一的下三…...
【JVM】详解对象的创建过程
文章目录 1、创建对像的几种方式1、new关键字2、反射3、clone4、反序列化 2、创建过程步骤 1、检查类是否已经被加载步骤 2、 为对象分配内存空间1、指针碰撞针对指针碰撞线程不安全,有两种方案: 2、空闲列表选择哪种分配方式 步骤3、将内存空间初始化为…...
华纳云:ubuntu下如何搭建nfs服务
在Ubuntu下搭建NFS(Network File System)服务,可以实现网络文件共享。以下是在Ubuntu上搭建NFS服务的步骤: 安装NFS服务器和客户端软件: 打开终端,并使用以下命令安装NFS服务器和客户端软件: sudo apt-get update s…...
HCIA实验二
实验要求: 1.R2为ISP,只能配置IP 2.R1-R2之间为HDLC封装 3.R2-R3之间为PPP封装,pap认证,R2为主认证方 4.R2-R4之间为PPP封装,chap认证,R2为主认证方 5.R1、R2、R3构建MGRE,仅R1的IP地址固定…...
stm32 舵机 cubemx
文章目录 前言一、cubemx配置二、代码1.serve.c2.serve.h3.主函数 总结 前言 stm32对舵机进行控制,很简单直接一个pwm就可以实现 pwm的周期是50HZ占空比分别对应 一个0.5ms的高电平对应于0度 一个1.5ms的高电平对应于90度 一个2.5ms的高电平对应于180度 因此&#…...
无涯教程-jQuery - Spinner组件函数
Widget Spinner 函数可与JqueryUI中的窗口小部件一起使用。Spinner提供了一种从一组中选择一个值的快速方法。 Spinner - 语法 $( "#menu" ).selectmenu(); Spinner - 示例 以下是显示Spinner用法的简单示例- <!doctype html> <html lang"en"…...
Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
Python 有趣的模块之pynupt ——通过pynput控制鼠标和键盘 文章目录 Python 有趣的模块之pynupt ——通过pynput控制鼠标和键盘1️⃣简介2️⃣鼠标控制与移动3️⃣键盘控制与输入4️⃣结语📢 1️⃣简介 🚀🚀🚀学会控制鼠标和键盘是…...
docker基于centos7镜像安装python3.7.9
下载centos7镜像 docker pull centos:centos7 启动容器centos-python-3.7 docker run -itd --name centos-python-3.7 -p 60021:22 --privileged centos:centos7 /usr/sbin/init 进入容器 docker exec -it centos-python-3.7 /bin/bash centos7环境下安装python3.7.…...
JavaScript中的switch语句
switch语句和if语句一样,同样是运用于条件循环中; 下面例子我们用switch实现 例如如果今天是周一就学习HTML,周二学习CSS和JavaScript,周三学习vue,周四,周五学习node.js,周六周日快乐玩耍&…...
Jquery笔记
DOM对象通过jquery获取 所有的代码都是基于引入jquery.js文件 var mydiv $(#div);//直接获取到DOM对象元素id var mydiv$(.div);//通过class获取DOM对象,如果有同名class只会获取第一个 var mysapn$(span);//通过元素的标签名获取DOM对象 var divarr$(…...
【C++】优先级队列的基本概念以及其模拟实现
文章目录 补充知识:仿函数一、优先级队列:1.引入2.介绍 二、priority_queue的模拟实现1.大体框架2.私有成员函数:1.向下调整(AdjustDown)2.向上调整(AdjustUp) 3.公有成员函数1大小(…...
TextClamp for Vue3.0(Vue3.0的文本展开收起组件)
呦!大家好,好久没有更新博客了,最近实现了一个一直想自己完成的一个东西,就是文本的展开收起组件,以前项目需要用到,自己实现一个又太繁琐,所以那个时候都是用的别人的轮子,现在自己…...
区间预测 | MATLAB实现VAR向量自回归时间序列区间预测
区间预测 | MATLAB实现VAR向量自回归时间序列区间预测 目录 区间预测 | MATLAB实现VAR向量自回归时间序列区间预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 区间预测 | MATLAB实现VAR向量自回归时间序列区间预测 VAR(Vector Autoregression)模型是一种广泛应用于时…...
在 Windows 上搭建 NTP 服务器
文章目录 一、基础环境二、适用场景三、操作步骤四、常用的NTP服务器五、参考资料 版权声明:本文为博主原创文章,于2023年7月30日首发于CSDN,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/u011046671 一、基础…...
USB外设概率性不识别问题详解
第一种情况,CPU主机端口下外接一个4口的扩展hub,但是扩展的hub端口概率性无法识别外设。如下log: 04-14 12:33:46.119450[ 18.884163] usb 3-1.2: new high-speed USB device number 4 using xhci-hcd 04-14 12:33:46.200327[ 18.964548]…...
如何快速掌握文档扫描优化:ScanTailor完整指南
如何快速掌握文档扫描优化:ScanTailor完整指南 【免费下载链接】scantailor 项目地址: https://gitcode.com/gh_mirrors/sc/scantailor 你是否曾为扫描文档的歪斜、污渍和模糊而烦恼?ScanTailor就是你的救星!这款强大的开源工具能智能…...
opencode使用安装
确保已经安装好node npm安装opencode C:\WINDOWS\system32>npm install -g opencode-aiadded 3 packages in 2mC:\WINDOWS\system32>npm安装mcp-chrome C:\WINDOWS\system32>npm...
Spine骨骼动画集成:Unity 2D游戏性能优化实战指南
1. 为什么Spine不是“另一个动画插件”,而是2D游戏性能分水岭在Unity里做2D游戏,很多人卡在同一个地方:角色动起来很卡,美术给的PSD切图动效一多就掉帧,UI动画和角色动画抢资源,打包后APK体积暴涨——你试过…...
Spotify推AI应用Studio,结合多信息源生成简报、播客和歌单!能“代你行动”
Spotify Studio:AI驱动的内容生成新利器Spotify Labs推出的全新独立AI应用程序Studio,可根据聊天机器人提示,在用户电脑上生成每日简报、播客和歌单。其生成内容会参考用户在Spotify上的收听历史,以及连接到该应用的其他应用信息&…...
成都制造企业SRM和ERP数据对不上,AI协同先治理什么?
系统都上线了,为什么协同还是慢不少成都制造企业已经有ERP,也陆续上了SRM、WMS、MES或QMS。采购订单在线审批,供应商可以在SRM里报价,仓库可以扫码入库,质量部门也有检验记录。可一到真实协同,问题仍然反复…...
GEO生成引擎优化:当品牌竞争从搜索结果页迁移到大模型对话窗口
当生成式AI成为信息的首要分发渠道,你的品牌还只盯着SEO吗?一、用户获取信息的路径,已经变了过去十几年,我们习惯了"搜索关键词 → 浏览结果页 → 点击进入网站"这条线性路径。SEO(搜索引擎优化)…...
魔兽争霸III终极优化指南:让你的经典游戏在现代系统上焕发新生
魔兽争霸III终极优化指南:让你的经典游戏在现代系统上焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在Window…...
2026年项目交付排期系统选型指南:10款主流工具深度测评
一、为什么你的项目总是交付延期?进入2026年,多项目并行、跨地域协作、人力资源紧张、需求频繁变更,已经成为各行业项目推进的常态化现状。当下多数项目出现交付延期问题,核心原因往往并非团队执行效率不足,而是项目排…...
选RFID仓储管理系统厂家别只盯着参数!老采购教你用场景思维找到真正靠谱的供应商
很多企业在选型RFID仓储管理系统时,第一反应是翻遍全网找“RFID智能仓储管理系统厂家有哪些”,然后把七八家供应商的参数表摊在桌上逐一对比。读取速度多少、识别距离多远、支持多少标签同时读取——这些指标当然重要,但如果你的选型逻辑仅停…...
