关闭

【WPF】右下角弹出自定义通知样式(Notification)——简单教程

2081人阅读 评论(2) 收藏 举报
分类:

1.先看效果

动态效果

2.实现

1.主界面是MainWindow

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

 public static List<NotificationWindow> _dialogs = new List<NotificationWindow>();
 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.结束了,就这么简单

CSDN下载

百度免费下载:链接: https://pan.baidu.com/s/1eSq5f8Y 密码: 5sna

2
0
查看评论

wpf实现仿qq消息提示框

1、实现步骤 1.1 另起一个窗口作为消息提示的窗口,在主窗体中调用,先处理一下消息框的展示问题, AllowsTransparency="True"  WindowStyle="None" WindowStartupLocation="...
  • huangli321456
  • huangli321456
  • 2016-01-15 13:34
  • 3493

WPF实现窗口从右下角垂直向上和水平向左淡出

受到腾讯弹出新闻什么的启发,才想着去实现了一下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sys...
  • u010771437
  • u010771437
  • 2015-08-15 15:18
  • 1934

WPF桌面右下角弹窗程序源码PopupWindow

  • 2013-01-07 11:16
  • 44KB
  • 下载

WPF实现半透明背景的弹框

WPF实现半透明背景的弹框
  • u011389297
  • u011389297
  • 2016-08-14 10:13
  • 4922

Wpf 弹出窗口

#region 新增 private void Add_Click(object sender,RoutedEventArgs e) { if(UserAdd.ShowModuleDialog().Equals(System.Windows.Forms.DialogResult.OK)) { ...
  • qq_31971935
  • qq_31971935
  • 2016-06-16 09:39
  • 742

WPF弹出一个窗口,并自动关闭

最近用WPF做了一个小的demo,由于对于WPF不是很熟悉,在这个过程中遇到不少问题,这篇文章便是针对某个小需求的整理,这个需求便是:在WPF中,如何弹出一个窗口,并让它定时自动关闭。 我记得我最早的思路是在主窗口中开启一个线程,这个线程每隔1s休眠一次,用这个线程来控制窗口的显示和隐藏。那个时候...
  • Lisliefor
  • Lisliefor
  • 2012-02-07 15:17
  • 16857

WPF如何弹出窗口

Title: WPF如何弹出窗口 Author:Kagula Date:2013-12-09 测试环境: [1]VS2010SP1 [2]WPF(.NET Framework 4)项目 内容简介       WPF工程如何弹出自定义窗...
  • lee353086
  • lee353086
  • 2013-12-09 15:48
  • 19527

wpf 仿qq消息提示框

  • 2016-01-15 13:23
  • 127KB
  • 下载

WPF-MVVM模式学习笔记5——NotificationObject学习

上一章,我学习了lambda表达式和lambda表达式树。这一次再反过头来看NotificationObject,就能看懂意思了,虽然其中还有一点没有看明白,但是那是细节,先从宏观上分析一下这个类。 public abstract class NotificationObject : IN...
  • mybelief321
  • mybelief321
  • 2015-03-20 17:19
  • 1878

【WPF】SnapsToDevicePixels与UseLayoutRounding二者到底有什么区别?供参考

MSDN上解释了一大堆,二者对比来看,并不能发现什么明显的区别,微软爸爸也不知道多给写图文实例。经过几个小时的摸索,现得到以下共同点和不同点,仅供参考:共同点 默认值都是false,如果设置到root元素上,则child元素也自动使用同样设置。 都是为了解决wpf元素边缘模糊的问题(如下)。 wpf...
  • catshitone
  • catshitone
  • 2017-08-21 19:05
  • 505
    个人资料
    • 访问:205550次
    • 积分:2786
    • 等级:
    • 排名:第15195名
    • 原创:90篇
    • 转载:18篇
    • 译文:1篇
    • 评论:36条
    文章分类
    最新评论