【wpf】handycontrol growl 打造一个比弹窗优雅10倍的信息通知方式

前言

话不多说,先上图:
在这里插入图片描述
这种弹框不会影响主进程的脚本,同时分为四个等级:

  • 普通消息:Info (时间一到,自动消失,除非鼠标停留上面)
  • 警告: Warning (时间一到自动消失,除非鼠标停留上面)
  • 错误:Error (不会自动消失,但是可以点击关闭)
  • 致命错误:Fatal (不会自动消失,也无法关闭)

这样优雅的弹框你想要吗?

准备工作

handycontrol 这个需要安装一下,安装过程这里不说了,不会的可以去官网看看。
handycontrol官网

界面部分

growl 弹框不是以控件的方式提供,他以附加属性的方式提供,只需要给他提供一个容身之所。
这里,我用ScrollViewer + StackPanel的方式 “包容” 她。

<!--弹出区域-->
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Right">
     <StackPanel hc:Growl.GrowlParent="True" VerticalAlignment="Top" Margin="0,10,10,10"/>
</ScrollViewer>

这样及时消息很多的情况也会一直排列下去。
这里的hc: 就是handycontrol的声明:

xmlns:hc="https://handyorg.github.io/handycontrol" 

我们将这部分的代码放到主界面

后台部分

接下来,其实只需要调用HandyControl.Controls.Growl.Info("XXXX");
或者是HandyControl.Controls.Growl.Error("XXXX")就可以实现弹框了。

但是 这里借助了prism的中的事件这个工具,这样的话,不管再那里,都能发送消息让主界面显示消息。这样产生一些报警消息就非常方便了!以下停供封装好的源码。

订阅封装

public MainWindow(IEventAggregator eventAggregator)
{
    //事件订阅
    eventAggregator.GetEvent<GrowlEvent>().Subscribe((GrowMsg msg) =>{
        if (msg.enumAlarmType == EnumAlarmType.Info)
        {
            HandyControl.Controls.Growl.Info(msg.message);
        }
        else if (msg.enumAlarmType == EnumAlarmType.Info)
        {
            HandyControl.Controls.Growl.Warning(msg.message);
        }
        else if (msg.enumAlarmType == EnumAlarmType.Err)
        {
            HandyControl.Controls.Growl.Error(msg.message);
        }
        else if (msg.enumAlarmType == EnumAlarmType.Fatal)
        {
            HandyControl.Controls.Growl.Fatal(msg.message);
        }
        else
        {
            HandyControl.Controls.Growl.Info(msg.message);
        }
    });
}

发送封装

void PostGrowlEvent(string strMessage, EnumAlarmType enumat)
{
    eventAggregator.GetEvent<GrowlEvent>().Publish(new GrowMsg()
    {
        enumAlarmType = enumat,
        message = strMessage,
    });
}

以下是 ,上面用到的 枚举类型,事件类型,和消息类型。

public enum EnumAlarmType
{
    Debug = 0,
    Info,
    Err,
    Fatal,
    Warning,
}

/// <summary>
/// 一个弹窗事件
/// </summary>
public class GrowlEvent : PubSubEvent<GrowMsg>
{
}

public class GrowMsg
{
    public EnumAlarmType enumAlarmType;
    public string message;
    public string token;
}

这样再任意地方调用PostGrowlEvent,主界面就能优雅的弹窗提示框了!!

prism 部分,可以参考我的专栏,感谢支持!
《【Prism系列】Prism事件聚合器》

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

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

相关文章

基于ssm海鲜自助餐厅系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此海鲜餐厅信息的…

SQL SELECT 语句

SELECT 语句用于从数据库中选取数据。 SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name; 与 SELECT * FROM table_name; 参数说明&#xff1a; …

软件测试之接口测试自动化(详解版)

本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测试领域的一些方法和心得&#xff0c;希望大家一起讨论和分享&#xff0c;内容包括但不仅限于&#xff1a; 服务端接口测试介绍接口测试自动化介绍接口测试自动化实践关于接口测试自动化的思考…

【Cisco Packet Tracer】路由器 NAT实验

NAT的实现方式有三种&#xff0c;即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。 静态转换是指内部本地地址一对一转换成内部全局地址&#xff0c;相当内部本地的每一台PC都绑定了一个全局地址。一般用于在内网中对外提供服务的服务器。 [3] 动态转换是指…

电商早报 | 12月9日| Temu在美国折扣店类别中占17%

Earnest analytics&#xff1a;Temu在美国折扣店类别中占17% 12月8日消息&#xff0c;根据公司 Earnest analytics 数据&#xff0c;截至上个月&#xff0c;Temu 在美国折扣店类别中占据了近17%的市场份额。作为对比&#xff0c;“一元店”连锁店 Five Below 占比为8%&#xf…

【Docker】进阶之路:(九)Docker网络

【Docker】进阶之路&#xff1a;&#xff08;九&#xff09;Docker网络 Docker网络模式简介bridge网络模式host网络模式none网络模式container网络模式user-defined网络模式1.创建自定义的bridge网络2.使用自定义网络 高级网络配置docker network命令 为什么要了解容器的网络模…

Stable Diffusion AI绘画系列【21】:写实女孩--圣诞主题风

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

关于使用EB tresos出现无法激活的情况解决

EB安装完成时需要激活才能使用的&#xff0c;不然都打开或者建立不了工程&#xff0c; 我在安装eb studio时就是在激活方面有问题导致无法使用&#xff0c;下面讲解出现了什么问题以及我如何去解除的。 1.出现的错误提示&#xff1f; ERROR&#xff1a;flexActAPPActivationSe…

一套rk3588 rtsp服务器推流的 github 方案及记录 -01

我不生产代码&#xff0c;我只是代码的搬运工&#xff0c;相信我&#xff0c;看完这个文章你的图片一定能变成流媒体推出去。 诉求&#xff1a;使用opencv拉流&#xff0c;转成bgr数据&#xff0c;需要把处理后的数据&#xff08;BGR&#xff09;编码成264&#xff0c;然后推流…

xml文本转Java对象

Java对象转String public static String toData(Object object) throws Exception {JAXBContext jc JAXBContext.newInstance(object.getClass());Marshaller m jc.createMarshaller();StringWriter output new StringWriter(2048);m.marshal(object, output);String data …

算法Day23 简单吃饭(0-1背包)

简单吃饭&#xff08;0-1背包&#xff09; Description Input Output Sample 代码 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int total scanner.nextInt(…

每日一练2023.12.9—— 矩阵A乘以B【PTA】

题目链接&#xff1a;L1-048 矩阵A乘以B 题目要求&#xff1a; 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列&#xff0c;B有Rb​行、Cb​列&#xff0c;则只有Ca​与Rb​相等时&a…

AI 赋能 | 智能制造的 AI 算法开发和工程实现

谈到智能制造、智慧工厂&#xff0c;愿景是美好的&#xff0c;借助计算机视觉技术和 AI 算法&#xff0c;为自动化生产线赋予环境感知的能力&#xff0c;从而改善工艺流程&#xff0c;提高生产效率。但是&#xff0c;随着柔性化生产的需求增长&#xff0c;产线的布局调整和功能…

centos7 docker Mysql8 搭建主从

Mysql8 搭建主从 docker的安装docker-compose的安装安装mysql配置主从在master配置在slave中配置在master中创建同步用户在slave中连接 测试连接测试配置测试数据同步遇到的问题id重复错误执行事务出错&#xff0c;跳过错误my.cnf 不删除多余配置的错误可能用到的命令 docker的…

每天五分钟计算机视觉:稠密连接网络(DenseNet)

本文重点 在前面的课程中我们学习了残差网络ResNet,而DenseNet可以看成是ResNet的后续,我们看一下图就可以看出二者的主要区别了。 特点 DenseNet是一种卷积神经网络,它的特点是每一层都直接连接到所有后续层。这意味着,每一层都接收来自前一层的输出,并将其作为输入传递…

五月天“假唱”争议持续升温,歌迷期待真实音符背后的真实交代

在12月3日的夜晚&#xff0c;“五迷”们心中的星辰仿佛黯淡了几分。在社交媒体上&#xff0c;关于五月天演唱会假唱的争论愈演愈烈&#xff0c;歌迷们的心情变得异常复杂。他们愤怒&#xff0c;是因为自己的偶像受到了质疑&#xff1b;他们伤心&#xff0c;是因为可能的假唱让他…

Java基础-开发流程以及HelloWorld程序

目录 1. Java的开发流程2. HelloWorld 1. Java的开发流程 开发Java程序&#xff0c;需要三个步骤&#xff1a;编写代码&#xff0c;编译代码&#xff0c;运行代码 2. HelloWorld 编写代码 public class HelloWorld {public static void main(String[] args) {System.out.pri…

Numpy自定义功能函数 np.apply_along_axis()(第14讲)

Numpy自定义功能函数 np.apply_along_axis()(第14讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

生日备忘录(自定义排序)

题目&#xff1a; 实现简易的生日备忘录。温暖的亲情是前进的动力&#xff0c;别忘记在家人生日时送 去祝福。定义类 Member 描述家庭成员&#xff0c;每位家人有自己的姓名 name 和出生日期 birthday&#xff0c;出生日期应描 述为由 year、month、day 组成的 Date 类。在 ma…

应用商店ASO优化提升APP排名的6大策略

ASO优化基操你了解多少&#xff1f; ASO优化对于APP推广运营来说是必不可少的一个方法。在当今竞争激烈的应用程序市场中&#xff0c;ASO&#xff08;App Store Optimization&#xff09;优化已成为提升APP排名和曝光度的关键因素。 一、ASO优化的重要性 ASO优化有助于提高AP…