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

本文介绍了如何利用Handycontrol库和Prism框架创建优雅的弹框通知系统,通过事件订阅和发布机制实现在不同场景下显示不同级别的消息,如普通信息、警告、错误和致命错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

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

2024年11月22日 踩坑记录

如果函数里面使用线程调用的PostGrowlEvent,那么整个函数都应该放到线程里面,不然会出现非常诡异的现象。
程序不报错,但是就卡死了。

比如 RunAll里面使用线程调用了 PostGrowlEvent
在这里插入图片描述

那么整个RunAll函数也需要放到线程里面:如下

Task.Run(() =>
{
    RunAll(roiVm.CurImg);
});

否则:事件订阅时,在调用Growl的时候就会发生诡异现象(不报错,但程序卡死)!!!
在这里插入图片描述
感觉应该是handycontrol 的bug!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code bean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值