博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【WPF】右下角弹出自定义通知样式(Notification)——简单教程
阅读量:6757 次
发布时间:2019-06-26

本文共 4080 字,大约阅读时间需要 13 分钟。

原文:

1.先看效果

动态效果

2.实现

1.主界面是MainWindow

上面就只摆放一个Button即可。在Button的点击事件中需要new一个弹出的NotificationWindow。代码如下:

public static List
_dialogs = new List
(); int i = 0; private void Button_Click(object sender, RoutedEventArgs e) { i++; NotifyData data = new WpfApplication1.NotifyData(); data.Title = "This is Title:"+i; data.Content = "content content content content content content content "; NotificationWindow dialog = new NotificationWindow();//new 一个通知 dialog.Closed += Dialog_Closed; dialog.TopFrom = GetTopFrom(); _dialogs.Add(dialog); dialog.DataContext = data;//设置通知里要显示的数据 dialog.Show(); } private void Dialog_Closed(object sender, EventArgs e) { var closedDialog = sender as NotificationWindow; _dialogs.Remove(closedDialog); }

其中NotifyData类只有两个属性分别是Title和Content,给NotificationWindow提供所要展示的消息数据。

GetTopFrom方法用来获取弹出通知框的底部应该在WorkArea(工作区)的哪个位置:

double GetTopFrom()        {            //屏幕的高度-底部TaskBar的高度。            double topFrom = System.Windows.SystemParameters.WorkArea.Bottom - 10;            bool isContinueFind = _dialogs.Any(o => o.TopFrom == topFrom);            while (isContinueFind)            {                topFrom = topFrom - 100;//此处100是NotifyWindow的高                isContinueFind = _dialogs.Any(o => o.TopFrom == topFrom);            }            if (topFrom <= 0)                topFrom = System.Windows.SystemParameters.WorkArea.Bottom - 10;            return topFrom;        }

2.弹出的通知是一个NotificationWindow

这个Window就一个Image,一个Button,两个TextBlock。

就长这个样子:


通知的样式


  • Image用来显示通知的图标,Button用来关闭当前window,两个TextBlock的Text属性分别banding到NotifyData类的Title和Content属性上,用来显示消息的标题和正文。

  • 在NotificationWindow中添加如下代码:

public double TopFrom{get; set;}private void NotificationWindow_Loaded(object sender, RoutedEventArgs e){            NotificationWindow self = sender as NotificationWindow;            if (self != null)            {                self.UpdateLayout();                SystemSounds.Asterisk.Play();//播放提示声                double right = System.Windows.SystemParameters.WorkArea.Right;//工作区最右边的值                self.Top = self.TopFrom - self.ActualHeight;                DoubleAnimation animation = new DoubleAnimation();                animation.Duration = new Duration(TimeSpan.FromMilliseconds(NotifyTimeSpan));//NotifyTimeSpan是自己定义的一个int型变量,用来设置动画的持续时间                animation.From = right;                animation.To = right - self.ActualWidth;//设定通知从右往左弹出                self.BeginAnimation(Window.LeftProperty, animation);//设定动画应用于窗体的Left属性                Task.Factory.StartNew(delegate                {                    int seconds = 5;//通知持续5s后消失                    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));                    //Invoke到主进程中去执行                    Invoke(self, delegate                    {                        animation = new DoubleAnimation();                        animation.Duration = new Duration(TimeSpan.FromMilliseconds(NotifyTimeSpan));                        animation.Completed += (s, a) => { self.Close(); };//动画执行完毕,关闭当前窗体                        animation.From = right - self.ActualWidth;                        animation.To = right;//通知从左往右收回                        self.BeginAnimation(Window.LeftProperty, animation);                    });                });            }}static void Invoke(Window win, Action a){     win.Dispatcher.Invoke(a);}

上面这段代码注释已经很明白了,没什么好讲的。

  • 当Button按钮点击后执行关闭窗体操作,这段代码其实跟上面的类似:
private void ButtonClose_Click(object sender, RoutedEventArgs e){            double right = System.Windows.SystemParameters.WorkArea.Right;            DoubleAnimation animation = new DoubleAnimation();            animation.Duration = new Duration(TimeSpan.FromMilliseconds(NotifyTimeSpan));            animation.Completed += (s, a) => { this.Close(); };            animation.From = right - this.ActualWidth;            animation.To = right;            this.BeginAnimation(Window.LeftProperty, animation);}

3.结束了,就这么简单

百度免费下载:链接: 密码: 5sna

转载地址:http://kbzeo.baihongyu.com/

你可能感兴趣的文章
二 IOC再探
查看>>
一些常用软件的网络端口协议分类介绍
查看>>
机器学习服务器 PredictionIO 脱颖而出
查看>>
mysql不能连接远程mysql服务器
查看>>
Windows 8.1 重复数据删除——概念(一)
查看>>
iptables防火墙高级应用
查看>>
python运维-Socket网络编程
查看>>
yum管理包流程_学习笔记
查看>>
DeltaGrad领跑智能化交易领域 预见收益颠覆基金行业
查看>>
nginx keepalived tomcat实现的高可用
查看>>
Https能避免流量劫持吗?
查看>>
oracle教程之oracle 删除表空间
查看>>
我的友情链接
查看>>
python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案
查看>>
Exchange server 2010 安装部署之二,Exchange2010安装详解
查看>>
负载均衡集群之LVS
查看>>
本地计算机无法启动Server服务
查看>>
优秀前端工程师需要做的10件事
查看>>
我的友情链接
查看>>
Android学习笔记-基于HTTP的通信技术
查看>>