【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. ...
随机推荐
- 设置/修改centos上的swap交换分区的方法
设置centos上的swap交换分区的方法 作为linux世界里最稳定的服务器版本,rhas5一直有很大的应用面,之前一直关注的是freebsd,因为应用的需要,特别在配合mysql和oracle上r ...
- centos7安装MySQL5.7无法设置密码问题
前言 在使用centos7系统yum方式安装MySQL5.7后 不知道默认密码是多少 知道后没办法修改? 一.找到MySQL密码 service mysqld start vim /var/log/ ...
- HDUOJ--4565 So Easy!
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 也来学学插件式开发续-利用MEF
前面一个博客:也来学学插件式开发中很多朋友留言说可以用MEF来实现.于是我就试着用MEF实现了一下. 步骤和上一篇差不多,只是加载插件的方式有所不同.这只是一个自己的示例程序,肯定有很多不足之处,欢迎 ...
- OAF_OAF增删改-新增的实现(案例)
2014-09-14 Created By BaoXinjian
- 【转】一个对 Dijkstra 的采访视频
一个对 Dijkstra 的采访视频 (也可以访问 YouTube 或者从源地址下载 MPEG1,300M) 之前在微博上推荐了一个对 Dijkstra 的采访视频,看了两遍之后觉得实在很好,所以再正 ...
- Linux标识进程
一.前言 其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核.随着linux container.pid namespace等概念的引入,进程标识方面已经有了天翻 ...
- Python endswith() 方法
描述 endswith() 方法用于判断字符串是否以指定后缀结尾,如果是则返回 True,否则返回 False. 语法 endswith() 方法语法: S.endswith(suffix[,star ...
- Java JNI的具体介绍
JNI就是Java Native Interface的简称,也就是java本地接口.它提供了若干的API实现了和Java和其它语言的通信(主要是C&C++).也许不少人认为Java已经足够强大 ...
- Wavenet运行
作者:桂. 时间:2017-05-10 19:17:32 链接:http://www.cnblogs.com/xingshansi/p/6832219.html 一.环境 python3.5 Win ...