此版本是根据别人的项目改造的,记录下笔记

原文:https://blog.csdn.net/catshitone/article/details/75089069

一、即时弹出

1.创建弹出框

新建一个100*300的WPF页面NotificationWindow.Xaml

 <Grid Background="AliceBlue">
<Button Click="Button_Click" Content="Close" HorizontalAlignment="Left" Margin="225,0,0,0" VerticalAlignment="Top" Width=""/>
<TextBlock x:Name="tbTitle" HorizontalAlignment="Left" Margin="31,16,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
<TextBlock x:Name="tbContent" HorizontalAlignment="Left" Margin="31,42,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
</Grid>

后置页代码

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

2.弹出消息

在主页面创建一个弹出按钮,事件如下

private void Button_Click(object sender, RoutedEventArgs e)
{
i++;
NotifyData data = new NotifyData();
data.Title = "这是标题:" + i;
data.Content = "这是手动内容 ";
showNotify(data);
} private void showNotify(NotifyData data)
{
NotificationWindow dialog = new NotificationWindow();//new 一个通知
dialog.Closed += Dialog_Closed;
dialog.TopFrom = GetTopFrom();
dialog.DataContext = data;//设置通知里要显示的数据
dialog.Show(); _dialogs.Add(dialog);
}

二、定时弹出

1.创建弹出框

  和前面的第一步一样

2.创建事件通知接口

部分代码

 /// <summary>
/// 事件通知接口
/// </summary>
public interface IEventNotify
{
/// <summary>
/// 事件通知
/// </summary>
void EventNotify(EventData eventData);
} /// <summary>
/// 事件数据实体
/// </summary>
public class EventData
{
public EventNotifyType EventNotify { get; set; } public object Data { get; set; }
}

3.实现定时消息

在消息管理类添加一个定时器,每隔3秒执行一次。

在Timer_Elapsed中,定时获取最新数据

public class NoticeManager : IDisposable
{
/// <summary>
/// 定时器
/// </summary>
private readonly Timer _timer;
public IMainEventCommnuicationHandler Handler { get; private set; } private int seconds = * ; public NoticeManager(IMainEventCommnuicationHandler handler)
{
Handler = handler;
_timer = new Timer(seconds * );
_timer.Elapsed += Timer_Elapsed;
_timer.Start(); } /// <summary>
/// 定时事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
for (int i = ; i < ; i++)
{
var notifyData = new NotifyData()
{
Title = "标题" + i,
Content = DateTime.Now.AddHours(i).ToString() };
EventData eventData = new EventData()
{
EventNotify = EventNotifyType.New,
Data = notifyData
};
Handler.EventNotify(eventData);
}
} public void Dispose()
{
if (_timer != null)
{
_timer.Stop();
_timer.Dispose();
}
}
}

4.弹出消息

private NoticeManager noticeManager;
private void Time_Click(object sender, RoutedEventArgs e)
{
if (noticeManager == null)
{
noticeManager = new NoticeManager(this);
btnTime.Content = "暂停弹出";
}
else
{
btnTime.Content = "定时弹出";
noticeManager.Dispose();
}
} public void EventNotify(EventData eventData)
{
if (eventData.EventNotify == EventNotifyType.New)
{
var data = eventData.Data as NotifyData;
SendMessage(data);
}
else
{
MessageBox.Show("其他定时消息");
}
} /// <summary>
/// 发出通知
/// </summary>
/// <param name="data"></param>
void SendMessage(NotifyData data)
{
//此处调用Invoke,否则会报错:“ 调用线程必须为 STA,因为许多 UI 组件都需要 ”。
App.Current.Dispatcher.Invoke(() =>
{
showNotify(data);
});
}

事件通知时不能直接使用UI组件,否则会报错:“ 调用线程必须为 STA,因为许多 UI 组件都需要 ”。

Dispatcher是一个线程控制器,反正你要控制线程里跑的东西,就要经过它。那么WPF里面,有个所谓UI线程,后台代码不能直接操作UI控件,需要控制,就要通过这个Dispatcher。

参考:https://www.cnblogs.com/xinaixia/p/5706096.html

demo下载:https://gitee.com/zmsofts/XinCunShanNianDaiMa/blob/master/NotificationDemoWPF.rar

WPF实战之一 桌面消息框(右下角消息弹出框)的更多相关文章

  1. ALV屏幕捕捉回车及下拉框事件&ALV弹出框回车及下拉框事件

    示例展示: 屏幕依据输入的物料编码或下拉框物料编码拍回车自动带出物料描述: 点击弹出框,输入物料编码拍回车带出物料描述,点击确认,更新ALV: 1.创建屏幕9000,用于处理ALV弹出框: 2.针对屏 ...

  2. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-4 模态弹出框--结构分析

    模态弹出框--结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-con ...

  3. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-3 模态弹出框

    模态弹出框(Modals) 这一小节我们先来讲解一个“模态弹出框”,插件的源文件:modal.js. 右侧代码编辑器(30行)就是单独引入 bootstrap 中发布出的“modal.js”文件. 样 ...

  4. Android----消息弹出框

    关于Android的知识,自从工作了就没有什么时间去总结学习过的知识,我个人比较喜欢学习后总结,今天就写一下关于android中消息弹出框的几种方式的简单示例,按照自己的思路写了一段,希望对和我一样在 ...

  5. Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

    PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封 ...

  6. 【Android】各式各样的弹出框与对菜单键、返回键的监听

    Android自带各式各样的弹出框.弹出框也是安卓主要的组件之中的一个.同一时候安卓程序能够对菜单键.返回键的监听.但在安卓4.0之后就禁止对Home键的屏蔽与监听,强制保留为系统守护按键.假设非要对 ...

  7. ReactNative: 使用弹出框组件ActionSheetIOS组件

    一.简介 在上一篇文章中,详细介绍了对话框组件,除此之外,React-Native系统还给开发者提供了一个弹框框组件ActionSheetIOS组件,它的弹出方式与对框框不同,它是从底部弹出,与iOS ...

  8. firefox下载文件弹出框之终极解决方案-vbs模拟键盘操作

    由于近期一直被firefox的保存文件弹出框困扰,摸索尝试过几种方法,已有的方法可以跑通但是对对效果不太满意,因此一直在寻找合适的解决办法. 最近发现了也可以通过VBS来处理弹出框,速度也不错,其原理 ...

  9. co-dialog弹出框组件-版本v2.0.0

    co-dialog theme 访问git:co-dialog 版本v2.0.0 主题2 coog.app('.theme2').use({ title: 'JUST CHECKING.', mess ...

  10. bootstrap中popover.js(弹出框)使用总结+案例

    bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...

随机推荐

  1. 使用redis可能出现的问题

    1)缓存与数据库双写不一致 2)缓存雪崩 3)缓存穿透 由于缓存中不存在某个key,所有的请求都会落到数据库上,会对数据库造成很大压力,甚至崩溃 一个简单的方案是将不存在的数据也缓存起来(value值 ...

  2. 偶写的第一个控件,一个用选择代替输入的Edit控件…

    FDataSource :=TDataSource.Create(self); FDBGrid.FreeNotification(self); FADOQuery.FreeNotification(s ...

  3. os与sys模块

    os 1.os.pardir #获取当前目录的父目录字符串名:('..') 2.os.mkdir('dirname') #创建单级目录:相当于shell中mkdir dirname 3.os.make ...

  4. 【翻译】A simple stone game

    题目描述 在学会了如何玩尼姆游戏之后,迈克开始尝试另一种看起来很多的石头游戏. 简单点. 游戏是这样的:两个玩家用一堆n块石头开始游戏.他们轮流从堆里取石头,每次至少取一块石头 一堆又一堆,每次他们至 ...

  5. Django学习目录

    Django学习目录 Django框架简介 Django基础 >>点我 ORM介绍 Django中ORM介绍 >>点我 ORM表操作 Django中ORM表相关操作 >& ...

  6. ElasticSearch常用操作

    查看某个INDEX库某个TYPE表,某个字段的分词结果  GET /${index}/${type}/${id}/_termvectors?fields=${fields_name}http://19 ...

  7. Spring bean实例化的方式

    实例化过程如图,方式如图. 甩代码. 方式一:构造方法 搞一个bean,修改一下xml配置 package com.itheima.instance.constructor; public class ...

  8. .NET框架 - NETCORE部署IIS

    .NET框架 - NETCORE部署IIS 1. 发布NETCORE项目. 2. 发布IIS 添加 网站 修改对应的程序池 为 ”无托管代码“. 3. 浏览网站. IIS 需提前安装好 .netcor ...

  9. C语言面试题大汇总之华为面试题 Eddy整理

    1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...

  10. react项目后台及上线步骤

    应同学要求,本人将react项目创建后台及上线流程书写如下: 前端部分 略…… 后台部分 (注:这里的后台是用的nodejs搭建的,使用的是express框架+ejs模板) 首先通过express快速 ...