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

原文: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. vscode 安装插件SVN 报vscode SVN not found

    1.软件环境 svn客户端安装的是TortoiseSVN: vscode 安装的为SVN的插件: 2. 问题现象 vscode打开文件夹后右下角提示如下报错:SVN not found. Instal ...

  2. Nginx 在线新增模块

    系统:Centos7.5 Nginx版本:1.12.2 今天给项目添加ssl证书时,发现nginx 竟然不支持ssl,经过查看,询问相关人员发现nginx编译的时候没有任何模块(历史原因).哎.... ...

  3. SQL进阶随笔--case用法(二)

    ---恢复内容开始--- 用 CHECK 约束定义多个列的条件关系 今天来说下check和case的用法.其实,CASE 表达式和 CHECK 约束是很般配的一对组合.也许有很多数据库工程师不怎么用 ...

  4. Asp.Net Core配置的知识总结

    配置在Asp.Net Core中由四个核心的对象组成: IConfiguration:配置的最终产出物,它代表了整个asp.net core应用的配置树,这棵树有根节点,子节点和叶子节点,根节点由IC ...

  5. mybatis将传入的Integer类型的0被识别成空字符串的问题

    更改mapper文件的sql如下: <if test="interger != null"> interger= #{interger} </if> 原因: ...

  6. React Navigation & React Native & React Native Navigation

    React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...

  7. mysql 小结

    Mariadb proxy maxscale01.test.com maxscale02.test.com Mariadb Galera Cluster db01.test.com db02.test ...

  8. 在access转sql server指定的转换无效

    今天继续昨天没解决的问题,还是继续报错数据库中“指定的转换无效”,看着这个错误都有点头大了,啊啊啊啊,因为无法再代码中寻找到具体点,只好在晚上继续查询 最后终于看到一条帖子说在转换的时候可能出现数据冲 ...

  9. /Date(1555554794000)/ 转换为日期格式

    /Date(1555554794000)/ 转换为 2019/4/18 new Date(parseInt('/Date(1555554794000)/'.substr(6, 13))).toLoca ...

  10. loadrunner断言多结果返回

    有这么一个场景,接口返回的多个状态都是正常的,那么在压测的时候,断言就需要多 init里面执行登录,根据返回获取到tokenId action中,执行登录后的操作,获取响应返回的状态,把正确的状态个数 ...