WPF实战之一 桌面消息框(右下角消息弹出框)
此版本是根据别人的项目改造的,记录下笔记
原文: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实战之一 桌面消息框(右下角消息弹出框)的更多相关文章
- ALV屏幕捕捉回车及下拉框事件&ALV弹出框回车及下拉框事件
示例展示: 屏幕依据输入的物料编码或下拉框物料编码拍回车自动带出物料描述: 点击弹出框,输入物料编码拍回车带出物料描述,点击确认,更新ALV: 1.创建屏幕9000,用于处理ALV弹出框: 2.针对屏 ...
- 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-4 模态弹出框--结构分析
模态弹出框--结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-con ...
- 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-3 模态弹出框
模态弹出框(Modals) 这一小节我们先来讲解一个“模态弹出框”,插件的源文件:modal.js. 右侧代码编辑器(30行)就是单独引入 bootstrap 中发布出的“modal.js”文件. 样 ...
- Android----消息弹出框
关于Android的知识,自从工作了就没有什么时间去总结学习过的知识,我个人比较喜欢学习后总结,今天就写一下关于android中消息弹出框的几种方式的简单示例,按照自己的思路写了一段,希望对和我一样在 ...
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框... AndBase中AbActivity封 ...
- 【Android】各式各样的弹出框与对菜单键、返回键的监听
Android自带各式各样的弹出框.弹出框也是安卓主要的组件之中的一个.同一时候安卓程序能够对菜单键.返回键的监听.但在安卓4.0之后就禁止对Home键的屏蔽与监听,强制保留为系统守护按键.假设非要对 ...
- ReactNative: 使用弹出框组件ActionSheetIOS组件
一.简介 在上一篇文章中,详细介绍了对话框组件,除此之外,React-Native系统还给开发者提供了一个弹框框组件ActionSheetIOS组件,它的弹出方式与对框框不同,它是从底部弹出,与iOS ...
- firefox下载文件弹出框之终极解决方案-vbs模拟键盘操作
由于近期一直被firefox的保存文件弹出框困扰,摸索尝试过几种方法,已有的方法可以跑通但是对对效果不太满意,因此一直在寻找合适的解决办法. 最近发现了也可以通过VBS来处理弹出框,速度也不错,其原理 ...
- co-dialog弹出框组件-版本v2.0.0
co-dialog theme 访问git:co-dialog 版本v2.0.0 主题2 coog.app('.theme2').use({ title: 'JUST CHECKING.', mess ...
- bootstrap中popover.js(弹出框)使用总结+案例
bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...
随机推荐
- Python----多元线性回归
多元线性回归 1.多元线性回归方程和简单线性回归方程类似,不同的是由于因变量个数的增加,求取参数的个数也相应增加,推导和求取过程也不一样.. y=β0+β1x1+β2x2+ ... +βpxp+ε 对 ...
- powershell 常用命令之取磁盘分区信息
//查看mac 地址 PS C:\Users\yyy> get-wmiobject -class Win32_NetworkAdapterConfiguration -namespace &qu ...
- Swoole入门到实战打造高性能赛事直播平台(完整版)
需要 的联系我,QQ:1844912514
- OpenCV4.1.0实践(2) - Dlib+OpenCV人脸特征检测
待更! 参考: python dlib opencv 人脸68点特征检测
- ubuntu apt-get install 时报错curl : Depends: libcurl4 (= 7.58.0-2ubuntu3.6) but 7.61.0-1ubuntu2 is to be installed或者 vim : Depends: vim-common (= 2:8.0.1453-1ubuntu1) but 2:8.0.1766-1ubuntu1 is to be ins
ubuntu apt-get install 时报错:Depends: ***(=某版本)but***(另一版本)is to be installed 这时候就把这个***给purge后再重新装就好了 ...
- html中title小图标的实现
<link rel="icon" href="picture.ico" type="image/x-icon"/> 注意:图片的 ...
- 使用elementUI滚动条之横向滚动
用过elementUI组件应该会知道它内置一个滚动效果,官网对此组件没有相关文档,也是细心网友发现的. <el-scrollbar></el-scrollbar> 将会出现滚动 ...
- 树莓派3B+(三)
上一篇中,我们配置好了基本的raspbain系统,接下来我们可以用xrdp或者vnc在Windows上远程连接树莓派. 一.安装xrdp xrdp和vnc是两种常见的远程桌面协议,可以进行可视化界面远 ...
- “三次握手,四次挥手”你真的懂吗?TCP
“三次握手,四次挥手”你真的懂吗? mp.weixin.qq.com 来源:码农桃花源 解读:“拼多多”被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手 ...
- go实现dgraph的各种操作
go实现dgraph的各种操作 import "github.com/dgraph-io/dgo" import "github.com/dgraph-io/dgo/pr ...