前言
话不多说,先上图:
这种弹框不会影响主进程的脚本,同时分为四个等级:
- 普通消息: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事件聚合器》