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

news2024/11/19 10:43:30

前言

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

  • 普通消息: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事件聚合器》

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

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

相关文章

【C++ Primer Plus学习记录】if语句

目录 一、if语句 二、if else语句 三、格式化if else语句 四、if else if else结构 一、if语句 if语句让程序能够决定是否应执行特定的语句。 if有两种格式&#xff1a;if和if else。 if语句的语法与while相似&#xff1a; if(test-condition)statement; 如果test-con…

Linux快速搭建本地yum更新audit

场景&#xff1a;内网一台服务器上线&#xff0c;需要更新audit版本&#xff0c;因无法与其他服务器通信&#xff0c;需临时配置本地仓库。 1、上传新版本操作系统iso到服务器 2、创建yum仓库文件存储目录 mkdir /opt/myrepo 3、挂载磁盘到/mnt mount /opt/Kylin-Server-V…

【头歌系统数据库实验】实验4 MySQL单表查询

目录 第1关. 在users表中新增一个用户&#xff0c;user_id为2019100904学号&#xff0c;name为2019-物联网-李明 第2关. 在users表中更新用户 user_id为robot_2 的信息&#xff0c;name设为 机器人二号 第3关. 将solution表中所有 problem_id 为1003 题目的解答结果&#xf…

MyBatis——Java 持久层框架

文章目录 MyBatis 是什么准备工作创建一个数据库和表引入依赖 配置连接字符串和 MyBatisMyBatis 组成MyBatis 使用步骤定义一个类创建 MyBatis 接口&#xff08;以查询所有为例&#xff09;创建与接口对应的 xml 文件&#xff08;实现接口中的所有方法&#xff09;使用单元测试…

Power BI - 5分钟学习拆分列

每天5分钟&#xff0c;今天介绍Power BI拆分列功能。 什么是拆分列&#xff1f; 有时导入Power BI的数据表中&#xff0c;某列内容都包含同样的特殊字符如 /&/-/_等&#xff0c;可以利用这个特殊字符进行拆分列的操作&#xff0c;获得我们想要的信息。 操作举例&#xf…

time模块(python)

一.sleep休眠 [rootrhel8 day04]# vim demo01_time.py import time def banzhuan():print("搬砖")time.sleep(3.5) #让程序休眠3.5秒print("结束")banzhuan()[rootrhel8 day04]# python3 demo01_time.py 搬砖 结束运行时&#xff0c;会发现程序中间暂停…

成本核算基础知识 – 了解实际成本

原文地址&#xff1a;Basics of Costing – Understanding Actual Cost | SAP Blogs 建议大家打开原文地址查看原文&#xff0c;有些地方专业术语翻译不一定正确。希望搬的这些文章能帮助查资料的大家一个信息&#xff0c;再跳转到原文去看。 一、概述 大家好&#xff0c; …

综合练习(OSPF+BGP+ISIS+单臂路由)

一、知识补充 1、链路聚合 为了满足不同服务器之间的数据交互&#xff0c;交换机之间必须具有更高的带宽&#xff0c;同时需要具备链路的冗余备份&#xff1b; 通常可以增加核心交换机之间的物理链路数量&#xff0c;以提高核心交换机之间的链路带宽&#xff1b;在启用STP的…

JDBC详解——增删改查(CRUD)、sql注入、事务、连接池

1. 概念&#xff1a; Java DataBase Connectivity&#xff0c; Java 数据库连接&#xff0c; Java语言操作数据库 JDBC本质&#xff1a;其实是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口。各个数据库厂商去实现这套接口&…

[RoBERTa]论文实现:RoBERTa: A Robustly Optimized BERT Pretraining Approach

文章目录 一、完整代码二、论文解读2.1 模型架构2.2 参数设置2.3 数据2.4 评估 三、对比四、整体总结 论文&#xff1a;RoBERTa&#xff1a;A Robustly Optimized BERT Pretraining Approach 作者&#xff1a;Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Da…

【【HDMI 彩条显示实验 】】

HDMI 彩条显示实验 本次实验参考自 《正点原子 FPGA 领航者开发板 第三十一章 彩条显示实验》 使用的是领航者开发板 ZYNQ - 7020 HDMI 是新一代的多媒体接口标准&#xff0c;英文全称是 High-Definition Multimedia Interface&#xff0c;即高清多媒体接口。它能够同时传输视…

【SQLite】SQLite3约束总结

前面学习了SQLite数据库的常见使用方法&#xff0c;其中包含许多约束&#xff0c;常见的如NOT NULL、DEFAULT、UNIQUE、PRIMARY KEY&#xff08;主键&#xff09;、CHECK等 本篇文章主要介绍这些约束在SQLite中的使用 目录 什么是约束NOT NULL 约束DEFAULT约束UNIQUE约束PRIMA…

【nuxt3】cannot read preperties of null (reading ‘$nuxt‘)

问题描述 vue3 中&#xff0c;通过 createVNode 创建子组件实例时&#xff0c;发现子组件无法获取到父组件中的 router、store 信息&#xff0c;一旦子组件使用就会报错。 问题原因 通过控制台断点调试&#xff0c;发现时 appContext 值为空导致的。怀疑是创建子组件的时候&a…

RHEL8---网络配置

本章主要介绍网络配置的方法。 网络基础知识查看网络信息图形化界面修改通过配置文件修改命令行管理主机名的设置 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS。 1、IP 地址 在计算机…

TOMCAT9安装

1、官网下载 2、解压到任意盘符&#xff0c;注意路径不要有中文 3、环境变量 path 下 配置 %CATALINA_HOME%\bin 4、找到tomcat9/bin&#xff0c; 点击 start.bat启动 tomcat

vue pc官网顶部导航栏组件

官网顶部导航分为一级导航和二级导航 导航的样子 文件的层级 router 文件层级 header 组件代码 <h1 class"logo-wrap"><router-link to"/"><img class"logo" :src"$config.company.logo" alt"" /><i…

Meta Platforms推出Imagine:基于Emu的免费AI文本到图像生成器服务

优势主要体现在以下两个方面&#xff1a; 精细运动控制&#xff1a; 该项目在实现摄像机运动和物体运动方面表现出色&#xff0c;成功实现了对两者运动的高度独立控制。这一特性为运动控制提供了更为精细的调整空间&#xff0c;使得在视频生成过程中能够实现更灵活、多样的运动…

Leetcode刷题笔记题解(C++):LCR 181. 字符串中的单词反转

思路&#xff1a;根据栈的原理先进后出&#xff0c;使用栈来依次保存每个单词&#xff0c;然后再依次从栈中取出每个单词 class Solution { public:string reverseMessage(string message) {int left 0;int right message.size()-1;//消除字符串前后多余的空格&#xff0c;比…

第1章-第1节-第一个Java程序,命令行编译并运行Java

第一个Java程序不用任何IDE&#xff0c;用记事本去编写&#xff0c;用命令行去编译并运行&#xff0c;这样便于了解Java程序运行原理。 1、首先打开记事本&#xff0c;写下如下代码&#xff1a; 然后另存为xxx.java&#xff0c;xxx文件名不强求与类名相同&#xff0c;但是建议…

安装@uni-helper/uni-app-types之后模板代码报错

安装uni-helper/uni-app-types之后模板代码一大片红 之后在https://uni-helper.js.org/uni-app-types找到了答案 配置tsconfig.json 添加vueCompilerOptions这个配置后&#xff0c;报错不见了 "vueCompilerOptions": {"nativeTags": ["block"…