示例:推荐一个应用Adorner做的表单对话框

news2025/1/18 6:25:44

一、目的:开发过程中经常会修改和查看一个Model的数据,一般情况下会自定义一个控件或Window去显示Model数据,但这种数据如果比较多会增加很多开发工作,本文介绍一种通用的方式,应用表达Form控件去简化处理,通常下只需在Model的Property属性上增加一些特性即可定制显示的表单信息和验证信息。


二、实现

显示效果如下 

三、环境


VS2022 Net7

四、使用方式

1、安装nuget包:H.Modules.Messages.Dialog和H.Modules.Messages.Form

 
首先,定义一个实体Model

public class Student
{

    [Display(Name = "姓名", GroupName = "基础信息")]
    [Required]
    public string Name { get; set; }

    [Display(Name = "班级", GroupName = "基础信息")]
    [Required]
    public string Class { get; set; }

    [Display(Name = "地址", GroupName = "基础信息")]
    [Required]
    public string Address { get; set; }

    [Display(Name = "邮箱", GroupName = "基础信息")]
    [Required]
    public string Emall { get; set; }

    [Display(Name = "可用", GroupName = "其他信息")]
    [Required]
    public bool IsEnbled { get; set; }

    [Display(Name = "时间", GroupName = "其他信息")]
    [Required]
    public DateTime Time { get; set; }

    [Display(Name = "年龄", GroupName = "基础信息")]
    [Required]
    public int Age { get; set; }

    [Display(Name = "分数", GroupName = "成绩信息")]
    [Range(0.0, 150.0)]
    public double Score { get; set; }

    [Display(Name = "电话号码", GroupName = "基础信息")]
    [Required]
    [RegularExpression("^1[3|4|5|7|8][0-9]{9}$", ErrorMessage = "手机号码不合法!")]
    public string Tel { get; set; }
    
}

之后,调用表单控件显示

            var student = new Student();
            await AdornerDialog.ShowPresenter(new StaticFormPresenter(student));

通过以上步骤即可实现该效果,详细说明如下

1,修改Student的属性的[Display(Name = "电话号码", GroupName = "基础信息")]特性可以自定义表单上显示的名称;

2,如果想增加自定义验证规则可以修改属性的[RegularExpression("^1[3|4|5|7|8][0-9]{9}$", ErrorMessage = "手机号码不合法!")]等继承自从ValidationAttribute特性,比如这句就是验证电话号码是否合法的特性;

再修改执行代码如下:

            Student student = new Student();
            Func<bool> canSumit = () =>
            {
                if (student.ModelStateDeep(out string error) == false)
                {
                    IocMessage.Dialog.Show(error);
                    return false;
                }
                return true;
            };
            StaticFormPresenter presenter = new StaticFormPresenter(student);
            await AdornerDialog.ShowPresenter(presenter, x =>
            {
                x.DialogButton = DialogButton.Sumit;
                x.Title = "Form Dailog";
            }, canSumit);

这时就会在提交时验证数据是否合法,当数据不合法时弹出异常信息,效果如下:

(注:验证数据这部分功能v1.0.1版本有问题,后面版本会修复) 

显示查看详情信息代码如下:

 Student student = new Student();
 Func<bool> canSumit = () =>
 {
     if (student.ModelStateDeep(out string error) == false)
     {
         MessageBox.Show(error);
         return false;
     }
     return true;
 };
 StaticFormPresenter presenter = new StaticFormPresenter(student);
 presenter.UsePropertyView = true;
 await AdornerDialog.ShowPresenter(presenter, x =>
 {
     x.DialogButton = DialogButton.None;
     x.Title = "Form Dailog";
 }, canSumit);

效果如下:

AdornerDailog部分参考文章:示例:推荐一个应用Adorner做的消息对话框-CSDN博客 

五、需要了解的知识点

RegularExpressionAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Learn

ValidationAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Learn

DisplayAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

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

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

相关文章

如何在Qt Designer中管理QSplitter

问题描述 当按下按钮时&#xff0c;我希望弹出一个对话框&#xff0c;用户可以在其中选择内容并最终按下 ‘Ok’ 按钮。我想在这个对话框中放置一个 QSplitter&#xff0c;左侧面板将显示树状结构&#xff0c;右侧将显示其他内容。如何正确实现这一点&#xff1f; 从 Qt 的示…

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化&#xff1a;ChatGPT在金融策略与算法交易中的实践》亮点内…

说说 SSL 的错误认识和不足之处

最近明月在学习折腾 LNMP 期间无意中建了一个 Typecho 的博客小站&#xff0c;近一周的折腾下来&#xff0c;收获真的不少&#xff0c;致使兴趣也越来越浓了&#xff0c;在升级 LNMP 的时候捎带手的给这个 Typecho 博客也启用了 SSL。并且开启了 memcached 和 OPcache 优化加速…

Android面试题之动画+事件处理篇

1、Android 中的动画有哪几类 帧动画、补间动画、属性动画 2、动画能组合在一起使用么&#xff1f; 可以将动画组合在一起使用AnimatorSet&#xff0c; AnimatorSet.play() 播放当前动画的同时可以 .with() &#xff1a;将现有动画和传入的动画同时执行 .after() &#xff1a…

神经网络与深度学习 - 神经网络基础

1.2 神经网络基础 学习目标 知道逻辑回归的算法计算输出、损失函数知道导数的计算图知道逻辑回归的梯度下降算法知道多样本的向量计算 应用 应用完成向量化运算应用完成一个单神经元神经网络的结构 1.2.1 Logistic回归 逻辑回归是一个主要用于二分分类的算法。给定一个特…

Altera不同系列的型号命名规则

Altera芯片型号&#xff1a;10AX07H4F34I3SG 20nm工艺 资源&#xff1a; 大数据 云计算 人工智能 图像处理 MSEL

OS复习笔记ch12-1

文件系统 概述 文件是大多数应用程序的核心要素&#xff0c;文件系统是操作系统对用户来说最重要的部分之一。 本章的主要内容见下图&#xff1a; 文件&#xff0c;大家耳熟能详的就是的docx、pdf、jpg、MP4等各种后缀文件&#xff0c;根据任务需要文件又分成了文本、图片、…

c++ 中如何往 string 字符串类型里插入浮点数

谢谢&#xff0c;在看王老师课程时&#xff0c;有如此用法&#xff0c;单独拿出来记录一下 (2) 这是为什么呢&#xff1f; 其实 cout << 3.33 ; 这样的代码是可以直接编译通过。 cout 就是 ostream 类型的对象。此类对象可以保存任何类型的数据。 STL 库为我们写好了大量…

Linux 五种IO模型

注&#xff1a;还有一种信号驱动IO&#xff0c;使用较少暂不讨论&#xff1b; 一&#xff0c;区分阻塞、非阻塞和同步、异步 看了很多文章对这两组概念解释和对比&#xff0c;说的太复杂了&#xff0c;其实没必要&#xff0c;两句话就能说清楚。 首先&#xff0c;对于读数据rec…

黑马苍穹外卖6 清理redis缓存+Spring Cache+购物车的增删改查

缓存菜品 后端服务都去查询数据库&#xff0c;对数据库访问压力增大。 解决方式&#xff1a;使用redis来缓存菜品&#xff0c;用内存比磁盘性能更高。 key :dish_分类id String key “dish_” categoryId; RestController("userDishController") RequestMapping…

如何配置taro

文章目录 step1. 全局安装wepacksetp2. 使用npm安装tarostep3. 项目初始化 使用taro时需要在本地配置好nodejs环境&#xff0c;关于如何配置nodejs可参考我的这篇博文 如何配置nodejs环境 step1. 全局安装wepack 使用指令npm install webpack -g即可 安装完成后可看到有wepa…

使用Vue+Antv-X6实现一个输送线可视化编辑器(支持拖拽、自定义连线、自定义节点等)

最近公司有这样的业务&#xff0c;要实现一个类似流程图的编辑器&#xff0c;可以拖拉拽之类的&#xff0c;网上寻找了一番&#xff0c;最终决定使用Antv-X6这个图形引擎&#xff0c;非常强大&#xff0c;文档多看几遍也就能上手使用了。感觉还不错就写个使用心得期望能帮助到同…

2000年 - 2022年 Fama-French三因子模型数据+代码

Fama-French三因子模型是由著名经济学家尤金法玛&#xff08;Eugene Fama&#xff09;和肯尼斯法兰奇&#xff08;Kenneth French&#xff09;提出的&#xff0c;旨在改进资本资产定价模型&#xff08;CAPM&#xff09;&#xff0c;更全面地解释资产收益率的变化。该模型认为&a…

论文笔记:Spatial-Temporal Interval Aware Sequential POI Recommendation

ICDE 2022 1 intro 1.1 背景 空间&#xff08;Spatial&#xff09;和时间&#xff08;Temporal&#xff09;信息是序列 POI 推荐中两个重要且相辅相成的因素。 空间因素&#xff08;如地理距离间隔&#xff09;可以在用户的历史轨迹呈现空间分簇现象时&#xff0c;细粒度刻画…

主流中间件--Redis

NOSQL 什么是NOSQL NoSQL(NoSQL Not Only SQL )&#xff0c;意即“不仅仅是SQL”&#xff0c;它泛指非关系型的数据库。 关系型数据库&#xff1a;以关系(由行和列组成的二维表)模型建模的数据库。简单理解&#xff1a;有表的就是关系型数据库。 NOSQL分类 Redis 什么是Redi…

L02_并发编程知识图谱

这些知识点你都掌握了吗&#xff1f;大家可以对着问题看下自己掌握程度如何&#xff1f;对于没掌握的知识点&#xff0c;大家自行网上搜索&#xff0c;都会有对应答案&#xff0c;本文不做知识点详细说明&#xff0c;只做简要文字或图示引导。 并发理论 并发编程Bug源头 为了…

反射机制详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Java从入门到精通 ✨特色专栏&#xff…

读书笔记之智能商业

智能商业 本书试图勾勒的是未来商业的大蓝图&#xff0c;目前中国市场变化速度非常之快&#xff0c;作者用了一个词来形容现在市场发展的特殊性&#xff1a;三浪叠加 1.0浪&#xff1a;传统的零售2.0浪&#xff1a;国美、苏宁为代表的综合商城模式3.0浪&#xff1a;以淘宝为代…

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了&#xff0c;因为种种原因&#xff0c;也有很久一段时间没接触过stm32了。等我捡起来的时候&#xff0c;发现很多都已经忘记了&#xff0c;重新捡…

【mysql】常用操作:维护用户/开启远程/忘记密码/常用命令

一、维护用户 1.1 创建用户 -- 语法 > CREATE USER [username][host] IDENTIFIED BY [password];-- 例子&#xff1a; -- 添加用户user007&#xff0c;密码123456&#xff0c;并且只能在本地可以登录 > CREATE USER user007localhost IDENTIFIED BY 123456; -- 添加用户…