【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事件聚合器》

猜你喜欢

转载自blog.csdn.net/songhuangong123/article/details/134894103