需求:鼠标静止一段时间后,显示浮窗广告。

思路:界面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");
}

参考:

【C#/WPF】用System.Timers.Timer计时器做浮窗广告的更多相关文章

  1. 【WPF】使用Popup控件做浮窗/提示框

    需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作. 效果如下图: 当鼠标移入左上角的[多选显示]框内,出现下面的浮窗(悬浮在原UI之上).当在浮窗外点击鼠标左键时,隐藏该浮窗. 由于该 ...

  2. C# 计时器用法(DispatcherTimer、System.Timers.Timer、System.Threading.Timer)

    首先,我觉得三种计时器最大的区别是:DispatcherTimer触发的内容会直接转到主线程去执行(耗时操作会卡住主线程),另外两个则是在副线程执行,如果需要修改界面,则需要手动转到主线程. Disp ...

  3. System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的 区别和用法

    System.Windows.Forms.Timer执行的时候,如果你在过程中间加一个sleep整个的界面就死掉了,但是另外两个没有这个情况,System.Timers.Timer.System.Th ...

  4. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    问题背景 C#小白,由于本公司IM系统服务端(java)是本人独立开发的,加上现在所在项目需要对接IM系统,于是IM的客户端(C#实现)对接工作就交给我了.于是C#小白的我天真的以为只要调用C#端的S ...

  5. System.Windows.Forms.Timer与System.Timers.Timer的区别(zz)

    .NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...

  6. .NET System.Timers.Timer的原理和使用(开发定时执行程序)

    概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔.然后可以操控此事件以提供定期处理.例如,假设您有一台关键性服务器,必须每周7 ...

  7. .NET中System.Diagnostics.Stopwatch、System.Timers.Timer、System.Threading.Timer 的区别

    1.System.Diagnostics.Stopwatch Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 Stopwatch 方案中,先调用 ...

  8. 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 ...

  9. System.Timers.Timer

    前言 System.Timers.Timer组件是基于服务器的计时器,它能够指定在应用程序中引发Elapsed事件周期性间隔,以处理相应事件. 使用示例: 运行结果展示: System.Timers. ...

随机推荐

  1. iOS自定义从底部弹上来的View

    概述 自定义蒙层弹起View,点击一下遮罩或界面上关闭按钮,页面会自动下去(从上向下) 详细 代码下载:http://www.demodashi.com/demo/10724.html 在一些少数据没 ...

  2. js的7个技巧

    http://www.vaikan.com/seven-javascript-things-i-wish-i-knew-much-earlier-in-my-career/

  3. 6种.net分布式缓存解决方式

    6种.net分布式缓存解决方式 1.     使用内置ASP.NET Cache (System.Web.Caching) : https://msdn.microsoft.com/en-us/lib ...

  4. C#基础蛋疼到爆的Byte类型表数范围之网兜毛衣见解……

    事实上写这篇对Byte类型表数范围的文章,真的是蛋疼+蛋疼+蛋疼,每每看到Byte表数范围这一块.都对-128如此的陌生与迷茫.操蛋的Byte,操蛋的人生-- 熊孩子出场:Byte 恶作剧结果:表数范 ...

  5. 【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 ...

  6. 【LeetCode】39. Combination Sum (2 solutions)

    Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combin ...

  7. linux服务器的Gzip文件压缩方法[转]

    一.gzip介绍 gzip是GNU zip的缩写,它是一个GNU自由软件的文件压缩程序,也经常用来表示gzip这种文件格式.软件的作者是Jean-loup Gailly和Mark Adler.1992 ...

  8. python练习笔记——利用信号signal处理僵尸进程

    1 signal处理僵尸进程的基于语法 利用信号signal处理僵尸进程的方法:signal(SIGCHLD,SIG_IGN),该方法也是第三种处理僵尸进程的方法. SIGCHLD:子进程状态改变后产 ...

  9. C#开发Windows Services服务--服务安装失败的解决办法

    问题1:“System.Security.SecurityException:未找到源,但未能搜索某些或全部事件日志.不可访问的日志: Security.” 正在运行事务处理安装. 正在开始安装的“安 ...

  10. Struts如何获取客户端ip地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...