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

摘要:
首先绘制通知窗口。您可以将ResizeMode=“NoResize”WindowStyle=“None”Toppost=“True”设置为删除窗口标题并将提示窗口保持在顶部。GetTopFrom负责计算弹出窗口从屏幕顶部的高度。按钮_单击以发送消息并弹出窗口。doubletopFrom=System.Windows.SystemParameters.WorkArea.Bottom-10;boolisContinueFind=_dialogs.Any;而{topFrom=topFrom-160;//这里100是NotifyWindow 160-100的高度,其余10是通知之间的间隔isContinueFind=_dialogs.Any;}iftopFrom=System。窗户。系统参数。工作区。底部-10;returntopFrom;}}2.3消息提醒窗口NotificationWindow_ Loaded的背景代码接收内容TopFrom和NotifyData,确定弹出窗口的位置,并在5s后关闭窗口。

1.先上效果图:

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

免责声明:文章转载自《WPF实现消息提醒(广告弹窗)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySql中float类型的字段的查询IP address could not be resolved: Name or service not known下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序小方块

第一步:配置animation.wxml文件(相当于html显示的页面) <import src="http://t.zoukankan.com/common/header.wxml" /> <import src="http://t.zoukankan.com/common/footer.wxml" /> <view cl...

WPF 中托管 UWP

托管标准 UWP 控件 1. 新建空白应用(通用 Windows)项目,确保目标版本和最低版本均设置为 Windows 10 版本 1903 或更高版本。在 UWP 应用项目中,安装Microsoft.Toolkit.Win32.UI.XamlApplication 2. 修改App的默认基类为XamlApplication <xaml:XamlAp...

继续聊WPF——自定义命令

作为春节前的最后一篇技术文章,写点什么呢?想了一下,就聊聊WPF中的命令吧。 命令这东西很有意思,简明一点说,它是一种逻辑,但这种逻辑可以被多种源调用,可以作用于多种目标上。如我们常见的“复制”,“剪切”等命令,它们本身就是一种逻辑——对剪切板进行操作的逻辑行为,不过,你会发现,它们不仅可以在菜单项中使用,也可以在工具栏按钮上使用,也可以通过快捷键Ctrl...

wpf中内置资源文件

wpf中包含三种文件类型 资源文件:编译到可执行或库 WPF 程序集中的数据文件。 内容文件:与可执行 WPF 程序集具有显式关联的独立数据文件。 源站点文件:与可执行 WPF 程序集没有关联的独立数据文件。 这三种类型的文件之间的一个重要区别是:资源文件和内容文件在生成时是已知的;程序集明确地知道它们的存在。但是对于源站点文件,程序集可能完全不知道它们...

Css3动画(一) 如何画3D旋转效果或者卫星围绕旋转效果

如何画3D旋转效果或者卫星围绕旋转效果,当然这个也是工作中的一个任务,我在网上翻了一下,并没有找到类似的东西,所以写下来还是费了一番功夫,因此我把它拿出来记录一下,当然替换了一部分内容。好了,话不多说,进入正题。 我们都知道,浏览器是一个平面的视觉效果,如何在一个平面上看出立体的3D效果呢,其实就是一个视觉差的问题。那我们就从一个平面视觉效果一步一步画出...

走进WPF之UI布局

一个成功的软件,离不开人性化的UI设计,如何抓住用户第一视觉,让用户产生依赖感,合适优雅的布局必不可少。本文以一些简单的小例子,简述WPF中布局面板控件的使用,仅供学习分享使用,如有不足之处,还请指正。 涉及知识点 在WPF中,关于布局面板控件,主要有以下几种: StackPanel:栈面板,可以将元素排列成一行或者一列。其特点是:每个元素各占一行或者一...