【C#/WPF】用System.Timers.Timer计时器做浮窗广告
需求:鼠标静止一段时间后,显示浮窗广告。
思路:界面XAML写好一个专门显示浮窗广告的Canvas,先设为不可见Visibility=”Collapsed”,然后用System.Timers.Timer类做计时器,设置该timer每秒钟重复运行一次(检测一次),给计数器自增并判断是否累计达到要显示广告的时间,要显示则修改为Visibility=”Visible”。界面绑定鼠标的移动事件为重置该计数器。广告右上角是关闭按钮,点击按钮修改回Visibility=”Collapsed”即可。
关键代码如下:
前台:
<!-- 浮窗广告:主界面鼠标静止一段时间后,显示该广告 -->
<Canvas x:Name="adCanvas" Width="400" Height="200" Visibility="Collapsed">
<!-- 关闭按钮 -->
<Button Command="{Binding CloseAdCanvasCommand}" Canvas.Right="0" Canvas.Top="0">
<Image Source="/项目名;component/Presentation/Resources/Images/tool.png" />
</Button>
</Canvas>
控制层关键代码
// 静止多少秒显示广告,写在了配置文件里
float adIntervalTime = float.Parse(ConfigurationManager.AppSettings["AD_WINDOW_INTERVAL_TIME"]);
#region 一段时间鼠标静止,浮窗广告
// 主界面鼠标移动事件。一段时间鼠标不移动,则浮窗广告
private void MouseMoveCommand()
{
adStopTime = 0; // 重置计时器
}
// 开始浮窗广告的计时
private void StartAdWindowTimer()
{
Timer timer = new Timer();
timer.Elapsed += new ElapsedEventHandler(TimerTick);
timer.Interval = 1000; // 每1秒重复检测一次
timer.Enabled = true;
}
// 计算是否要显示浮窗广告
private void TimerTick(object sender, EventArgs e)
{
adStopTime++;
if (adStopTime >= adIntervalTime && allowADShow)
{
adCanvasChangeVisibility(true);
allowADShow = false;
}
}
// 改变浮窗广告Canvas的显隐
private void adCanvasChangeVisibility(bool visible)
{
App.Current.Dispatcher.Invoke((Action)delegate // <--- HERE
{
if (visible)
adCanvas.Visibility = Visibility.Visible;
else
adCanvas.Visibility = Visibility.Collapsed;
});
}
// 初始化浮窗广告
private void InitAdCanvas()
{
adCanvas = shellWindow.adCanvas;
adCanvasChangeVisibility(false);
// 背景是广告图片
ImageBrush brush = new ImageBrush();
brush.ImageSource = new BitmapImage(new Uri("pack://application:,,,/项目名;component/Presentation/Resources/Images/logo.jpg"));
adCanvas.Background = brush;
}
// 关闭浮窗广告
private void CloseAdCanvasCommand()
{
adCanvasChangeVisibility(false);
allowADShow = true;
}
#endregion
资料参考MSDN中System.Timers.Timer类的使用:
2018.3.12更新:
另一种思路,用AutoResetEvent控制线程的阻塞、唤醒。
private void TestTimer()
{
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
int limit = ;
int index = ;
while (!autoResetEvent.WaitOne(TimeSpan.FromSeconds())) // 每隔3秒钟执行一次循环体
{
index++;
Console.WriteLine("index = " + index);
if (index >= limit)
{
autoResetEvent.Set(); // 跳出循环体
}
} Console.WriteLine("Thread got signal");
}
参考:
- http://blog.csdn.net/hejingyuan6/article/details/39700499
- http://blog.csdn.net/theoldfuture/article/details/52420913
- https://www.cnblogs.com/jicheng/articles/5998244.html
- https://www.cnblogs.com/czytcn/p/8085071.html
- https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.waithandle.waitone?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(System.Threading.WaitHandle.WaitOne);k(TargetFrameworkMoniker-.NETFramework&view=netframework-4.7.1
【C#/WPF】用System.Timers.Timer计时器做浮窗广告的更多相关文章
- 【WPF】使用Popup控件做浮窗/提示框
需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作. 效果如下图: 当鼠标移入左上角的[多选显示]框内,出现下面的浮窗(悬浮在原UI之上).当在浮窗外点击鼠标左键时,隐藏该浮窗. 由于该 ...
- C# 计时器用法(DispatcherTimer、System.Timers.Timer、System.Threading.Timer)
首先,我觉得三种计时器最大的区别是:DispatcherTimer触发的内容会直接转到主线程去执行(耗时操作会卡住主线程),另外两个则是在副线程执行,如果需要修改界面,则需要手动转到主线程. Disp ...
- System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的 区别和用法
System.Windows.Forms.Timer执行的时候,如果你在过程中间加一个sleep整个的界面就死掉了,但是另外两个没有这个情况,System.Timers.Timer.System.Th ...
- C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
问题背景 C#小白,由于本公司IM系统服务端(java)是本人独立开发的,加上现在所在项目需要对接IM系统,于是IM的客户端(C#实现)对接工作就交给我了.于是C#小白的我天真的以为只要调用C#端的S ...
- System.Windows.Forms.Timer与System.Timers.Timer的区别(zz)
.NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...
- .NET System.Timers.Timer的原理和使用(开发定时执行程序)
概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔.然后可以操控此事件以提供定期处理.例如,假设您有一台关键性服务器,必须每周7 ...
- .NET中System.Diagnostics.Stopwatch、System.Timers.Timer、System.Threading.Timer 的区别
1.System.Diagnostics.Stopwatch Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 Stopwatch 方案中,先调用 ...
- System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差别和分别什么时候用
System.Windows.Forms.Timer.System.Timers.Timer.System.Threading.Timer的 区别和用法http://space.itpub.net/1 ...
- System.Timers.Timer
前言 System.Timers.Timer组件是基于服务器的计时器,它能够指定在应用程序中引发Elapsed事件周期性间隔,以处理相应事件. 使用示例: 运行结果展示: System.Timers. ...
随机推荐
- iOS自定义从底部弹上来的View
概述 自定义蒙层弹起View,点击一下遮罩或界面上关闭按钮,页面会自动下去(从上向下) 详细 代码下载:http://www.demodashi.com/demo/10724.html 在一些少数据没 ...
- js的7个技巧
http://www.vaikan.com/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/
- 6种.net分布式缓存解决方式
6种.net分布式缓存解决方式 1. 使用内置ASP.NET Cache (System.Web.Caching) : https://msdn.microsoft.com/en-us/lib ...
- C#基础蛋疼到爆的Byte类型表数范围之网兜毛衣见解……
事实上写这篇对Byte类型表数范围的文章,真的是蛋疼+蛋疼+蛋疼,每每看到Byte表数范围这一块.都对-128如此的陌生与迷茫.操蛋的Byte,操蛋的人生-- 熊孩子出场:Byte 恶作剧结果:表数范 ...
- 【LeetCode】40. Combination Sum II (2 solutions)
Combination Sum II Given a collection of candidate numbers (C) and a target number (T), find all uni ...
- 【LeetCode】39. Combination Sum (2 solutions)
Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combin ...
- linux服务器的Gzip文件压缩方法[转]
一.gzip介绍 gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式.软件的作者是Jean-loup Gailly和Mark Adler.1992 ...
- python练习笔记——利用信号signal处理僵尸进程
1 signal处理僵尸进程的基于语法 利用信号signal处理僵尸进程的方法:signal(SIGCHLD,SIG_IGN),该方法也是第三种处理僵尸进程的方法. SIGCHLD:子进程状态改变后产 ...
- C#开发Windows Services服务--服务安装失败的解决办法
问题1:“System.Security.SecurityException:未找到源,但未能搜索某些或全部事件日志.不可访问的日志: Security.” 正在运行事务处理安装. 正在开始安装的“安 ...
- Struts如何获取客户端ip地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...