WPF实现消息提醒(广告弹窗)

原文:WPF实现消息提醒(广告弹窗)

1.先上效果图:

2.1t提示框界面。 主窗口界面没什么内容,就放了一个触发按钮。先绘制通知窗口(一个关闭按钮,俩个文本控件),可以设置下ResizeMode="NoResize" WindowStyle="None"   Topmost="True",

去掉窗口标题,并使提示窗口始终处于最上层。

<Border BorderThickness="1" BorderBrush="Black">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="6*" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid Background="White">
            <Button
                Margin="5"
                HorizontalAlignment="Right"
                VerticalAlignment="Top"
                Background="White"
                BorderThickness="0"
                Click="Button_Click"
                Content=" × "
                FontSize="18" />
            <TextBlock
                x:Name="tbTitle"
                Margin="5"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                FontSize="16"
                Text="TextBlock"
                TextWrapping="Wrap" />
            <TextBlock
                x:Name="tbContent"
                Margin="20,40,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                FontSize="16"
                Text="TextBlock"
                TextWrapping="Wrap" />
        </Grid>
        <Grid Grid.Row="2" Background="#F0F0F0" />
    </Grid>
    </Border>

2.2主窗口后台代码。

NotifyData类是弹出窗口的推送消息。
List<Window1>计算高度时,如果窗口关闭,窗口就会从List中移除。
GetTopFrom负责计算弹出窗口距离屏幕顶端的高度。
Button_Click 传递消息,弹出窗口。
 
   class NotifyData
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }

   public partial class MainWindow : Window
    {
        int i = 0;
        public static List<Window1> _dialogs = new List<Window1>();
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            i++;
            NotifyData data = new NotifyData();
            data.Title = "提示";
            data.Content = "XXX余额不足,XXX余额不足,XXX余额不足,XXX余额不足" + i;
            Window1 dialog = new Window1();//new 一个通知
            dialog.Closed += Dialog_Closed;
            dialog.TopFrom = GetTopFrom();
            dialog.DataContext = data;//设置通知里要显示的数据
            dialog.Show();
            _dialogs.Add(dialog);
        }
        private void Dialog_Closed(object sender, EventArgs e)
        {
            var closedDialog = sender as Window1;
            _dialogs.Remove(closedDialog);
        }
        double GetTopFrom()
        {
            //屏幕的高度-底部TaskBar的高度。
            double topFrom = System.Windows.SystemParameters.WorkArea.Bottom - 10;
            bool isContinueFind = _dialogs.Any(o => o.TopFrom == topFrom);
            while (isContinueFind)
            {
                topFrom = topFrom - 160;//此处100是NotifyWindow的高 160-100剩下的10  是通知之间的间距
                isContinueFind = _dialogs.Any(o => o.TopFrom == topFrom);
            }
            if (topFrom <= 0)
                topFrom = System.Windows.SystemParameters.WorkArea.Bottom-10;
            return topFrom;
        }
    }

2.3消息提醒窗后台代码

NotificationWindow_Loaded 接收传过来的内容TopFrom和NotifyData,然后确定弹出窗口位置,并在5S后关闭窗口。
Button_Click 关闭窗口

 public partial class Window1 : Window
    {
        public double TopFrom
        {
            get; set;
        }

        public Window1()
        {
            InitializeComponent();
            this.Loaded += NotificationWindow_Loaded;
        }

        private void NotificationWindow_Loaded(object sender, RoutedEventArgs e)
        {

           NotifyData data = this.DataContext as NotifyData;
            if (data != null)
            {
                tbContent.Text = data.Content;
                tbTitle.Text = data.Title;
            }
            Window1 self = sender as Window1;
            if (self!=null)
            {
                double right=SystemParameters.WorkArea.Right-10;//工作区最右边的值
                self.Top = TopFrom - 160;
                DoubleAnimation animation = new DoubleAnimation();
                animation.Duration = new Duration(TimeSpan.FromMilliseconds(500));
                animation.From = right;
                animation.To = right - self.ActualWidth;
                self.BeginAnimation(Window.LeftProperty, animation);

                Task.Factory.StartNew(delegate
                {
                    int seconds = 5;//通知持续5s后消失
                    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));
                    //Invoke到主进程中去执行
                    this.Dispatcher.Invoke(delegate
                    {
                        animation = new DoubleAnimation();
                        animation.Duration = new Duration(TimeSpan.FromMilliseconds(500));
                        animation.Completed += (s, a) => { self.Close(); };//动画执行完毕,关闭当前窗体
                        animation.From = right - self.ActualWidth;
                        animation.To = right;//通知从左往右收回
                        self.BeginAnimation(Window.LeftProperty, animation);
                    });
                });
            }
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            double right = SystemParameters.WorkArea.Right;
            DoubleAnimation animation = new DoubleAnimation();
            animation.Duration = new Duration(TimeSpan.FromMilliseconds(500));
            animation.Completed += (s, a) => { this.Close(); };
            animation.From = right - this.ActualWidth;
            animation.To = right;
            this.BeginAnimation(Window.LeftProperty, animation);
        }
    }

3.源码下载地址

https://files-cdn.cnblogs.com/files/king10086/NoticeDemo.7z

原文地址:https://www.cnblogs.com/lonelyxmas/p/12652497.html

时间: 2024-11-06 11:38:06

WPF实现消息提醒(广告弹窗)的相关文章

javascript-浏览器消息提醒

如何让用户在浏览器最小化的状态下也能及时的收到消息提醒呢? 这个问题作为webRd是要正面面对的. 大约可分两种场景:一种是类似桌面通知的形式还有一种是类似QQ提醒(在系统任务栏闪烁随后高亮);接下来分别研究下: 桌面提醒: 这个H5有个强大的API没错就是Notification, 没听过? https://developer.mozilla.org/en-US/docs/Web/API/notification 先去了解下,很详细;浏览器不同对其支持程度也不同,简单讲就是有兼容问题,而笔者要

使用SignalR实现消息提醒

Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着Html5中WebSockets出现,SignalR也支持WebSockets通信.另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在Linux环境下. SignalR内部有两类对象:

RTX消息提醒工具设计文档

为什么要做 项目上线后,系统依然由各业务模块负责人自己维护.而后台运行的各种业务服务结果,不能及时反馈到业务负责人.而等到客户反馈时则会太被动.为了能及时发现并解决项目问题,设计了该工具. 可利用资源 1.公司内不能连接外网,沟通主要使用RTX.可以提供RTX服务器信息 2.公司内可以直接连到生产环境. 怎么做1.软件结构图 2.时时获取服务日志 开发环境可以直接连接到生产环境,则可以通过一个独立线程定时获取错误日志信息.错误日志信息包括:错误模块,错误描述.3.配置RTX与业务模块的关系 RT

页面即时消息提醒的实现

具体功能需求: 当有人给你留言或者私信的时候,你这边会即时有提醒说有人给你留言或者有私信. 分析:该功能类似于QQ的消息提醒,当有人找你聊天的时候,这边有头像闪动的提醒.由于在页面要做到这个效果,并且页面不全部刷新,故可以使用ajax来解决.那么问题又来了,ajax只会调用一次,不会重复调用,所以需要一个函数实现重复调用ajax函数.经过查资料,JavaScript中的 self的setInterval方法可以实现该效果,重复调用一个函数. self.setInterval("函数",

PHP实现RTX发送消息提醒

RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档(客户端,服务器),我们先看看功能效果:                   当然,现在很多公司都已经在RTX的基础上升级成了企业微信,没关系,这个API同样可以使用,还是同样的接口,只是展示效果不一样而已: 下面是用PHP实现RTX发送消息提醒: 1.首先在服务器端安装RTX的服务端和客户端,再安装

用 mongodb 储存多态消息/提醒类数据(转)

原文:http://codecampo.com/topics/66 前天看到 javaeye 计划采用mongoDB实现网站全站消息系统,很有同感,mongodb 很适合储存消息类数据.之前讨论了如何构建一个微博型广播,这次讨论一下怎么储存消息/提醒类数据. 下面的内容不涉及关于海量数据储存的问题,只讨论数据模式. 1. 需求 消息/提醒类数据有不少例子,比如豆瓣的好友广播(我说.电影/书籍已读状态.网址推荐等),Twitter 的推信息 Tweet,SNS 的好友状态. 这类信息的一个特点是模

原生JS实现各种经典网页特效——Banner图滚动、选项卡切换、广告弹窗等

在制作网页过程中,我们可能会遇到各种常用的经典网页特效,比如Banner图片滚动.选项卡循环播放.右下角广告弹窗.评论提交展示.选项动态增删.剪刀石头布小游戏等等等...是不是感觉都见到过这些场景.那些这些场景都是如何实现的呢?今天,小瑞老师就一口气把所有经典网页特效效果送给大家!!!          全部都是原生JS实现哦~~根本不需要什么JQuery.AngularJS等各种类库,是不是很激动,让我们开始吧~         Tips: 可以收藏博客,保存源码,关键时刻Ctrl+C哦~[微

如何去掉论坛右下角的新短消息提醒

如何去掉论坛右下角的新短消息提醒打开\template\default\common\footer.htm文件,然后找到137-150行的代码删除即可 <script type="text/javascript"> var h5n = new Html5notification(); if(h5n.issupport()) { <!--{if $_G[member][newpm] && $_GET[do] != 'pm'}--> h5n.show

高仿微信5.2.1主界面及消息提醒

好久没更新博客了,最近在做公司的项目,这也算是我接触的第一个正式项目.通过项目的检验,发现自己积累了一年的知识还是远远不够,想要提高,好的方法是 :项目+书+视频+博客.最重要一点:勤动手.最近发现了慕课网的视频,居然都是高清无码免费的!而且满满的干货!我用业余时间跟着视频中大神的讲解学习了不少知识,下面就将这些小demo与大家分享,当然,我做了一些优化,代码与视频中有些出入,但功能可以完全实现. 这是一个模仿5.2.1版本的显示界面,如下图所示: 功能及实现思路简介 主要功能很简单: 1.上面