WPF 入门教程DispatcherTimer计时器

https://www.zhihu.com/tardis/bd/art/430630047?source_id=1001

在 WinForms 中,有一个名为 Timer 的控件,它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性,但我们有DispatcherTimer控件,而不是不可见的控件。它几乎做同样的事情,但不是将它放在表单上,​​而是专门从代码隐藏代码中创建和使用它。

DispatcherTimer 类的工作方式是指定一个时间间隔,然后订阅每次满足该时间间隔时将发生的Tick事件。在调用Start()方法或将IsEnabled属性设置为 true之前,不会启动 DispatcherTimer 。

让我们尝试一个简单的例子,我们使用 DispatcherTimer 创建一个数字时钟:

<Window x:Class="WpfTutorialSamples.Misc.DispatcherTimerSample"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="DispatcherTimerSample" Height="150" Width="250"><Grid><Label Name="lblTime" FontSize="48" HorizontalAlignment="Center" VerticalAlignment="Center" /></Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Threading;namespace WpfTutorialSamples.Misc
{public partial class DispatcherTimerSample : Window{public DispatcherTimerSample(){InitializeComponent();DispatcherTimer timer = new DispatcherTimer();timer.Interval = TimeSpan.FromSeconds(1);timer.Tick += timer_Tick;timer.Start();}void timer_Tick(object sender, EventArgs e){lblTime.Content = DateTime.Now.ToLongTimeString();}}
}

XAML 部分非常简单——它只是一个带有大字体的居中标签,用于显示当前时间。

在这个例子中,代码隐藏是魔法发生的地方。在窗口的构造函数中,我们创建了一个 DispatcherTimer 实例。我们将Interval属性设置为 一秒,订阅 Tick 事件,然后启动计时器。在 Tick 事件中,我们只需更新标签以显示当前时间。

当然,DispatcherTimer 可以以更小或更大的间隔工作。例如,您可能只希望每 30 秒或 5 分钟发生一次 - 只需使用 TimeSpan.From* 方法,如 FromSeconds 或 FromMinutes,或创建一个完全符合您需求的新 TimeSpan 实例。

为了展示 DispatcherTimer 的功能,让我们尝试更频繁地更新……更频繁地更新!

using System;
using System.Windows;
using System.Windows.Threading;namespace WpfTutorialSamples.Misc
{public partial class DispatcherTimerSample : Window{public DispatcherTimerSample(){InitializeComponent();DispatcherTimer timer = new DispatcherTimer();timer.Interval = TimeSpan.FromMilliseconds(1);timer.Tick += timer_Tick;timer.Start();}void timer_Tick(object sender, EventArgs e){lblTime.Content = DateTime.Now.ToString("HH:mm:ss.fff");}}
}

如您所见,我们现在要求 DispatcherTimer 每毫秒触发一次!在 Tick 事件中,我们也使用自定义时间格式字符串来显示标签中的毫秒数。现在您有一些可以轻松用作秒表的东西 - 只需向窗口添加几个按钮,然后让它们调用 计时器上的Stop()Start()Restart()方法。

概括

在许多情况下,您需要在给定的时间间隔内在应用程序中发生某些事情,而使用 DispatcherTimer,这很容易实现。请注意,如果您在 Tick 事件中做了一些复杂的事情,它不应该运行得太频繁,就像在上一个示例中,计时器每毫秒滴答一次——这会给运行您的应用程序的计算机带来沉重的压力。

另请注意,DispatcherTimer 并非在所有情况下都 100% 精确。tick 操作放在 Dispatcher 队列中,因此如果计算机压力很大,您的操作可能会延迟。.NET 框架承诺 Tick 事件永远不会太早发生,但不能承诺它不会稍微延迟。但是,对于大多数用例, DispatcherTimer 已经足够精确了。

如果您需要您的计时器在队列中具有更高的优先级,您可以通过发送 DispatcherTimer 优先级上的值之一来设置 DispatcherPriority 。

推荐WPF MVVM框架开源控件库:Newbeecoder.UI

​编辑https://www.zhihu.com/video/1515266659548389376

Demo下载:

Newbeecoder.UI开源项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/325117.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建一个TcpConnection实例 以及 接收客户端数据

#CSDN 年度征文&#xff5c;回顾 2023&#xff0c;赢专属铭牌等定制奖品# 一、主线程反应堆模型的事件添加和处理详解 >>服务器和客户端建立连接和通信流程&#xff1a; 基于多反应堆模型的服务器结构图&#xff0c;这主要是一个TcpServer&#xff0c;关于HttpServer,…

图像分割实战-系列教程11:U2NET显著性检测实战3

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 U2NET显著性检测实战1 U2NET显著性检测实战2 U2NET显著性检测实战3 6、上采样操作与REBNCONV def…

酷开科技 | 酷开系统9.2,开启个性化时代

现代人&#xff0c;总喜欢不走寻常路&#xff0c;以彰显自己的不同。酷开系统的个性化推荐就能满足你的这类需求&#xff0c;既能给你想要的内容&#xff0c;又能给你与众不同的体验&#xff01; 想听音乐了&#xff1f;打开酷开系统音乐频道&#xff0c;随机播放为你推荐的歌曲…

IDEA 2023快捷键

1、main | sout | psvm 2、CTALD 复制当前行 3、ALT SHIFT ↕ 可以把当前行代码进行移动 4、CTRLH 类的继承继承结构 5、CTRLF12 类的成员 6、 SHIFTF6 统一修改变量 7、CTRLATLH 方法调用层级 8、ALT1 是否展示左侧菜单 9、ALTinsert 生成一些代码 10、CTRLP 提示参数…

【机器学习】循环神经网络(一)

一、网络结构 RNN 处理输入序列时的信息流。 粗体箭头为各时间点信息流的活跃路径&#xff0c;虚线箭头显示当时不活动的连接。 一个简单RNN例子 RNN 不是一类网络&#xff0c;而是适用于不同问题的拓扑结构的集合。循环网络的一个有趣的方面是&#xff0c;有了足够的层和节点&…

在Docker中安装和配置InfluxDB,设置SSL和密码保护

在Docker中安装和配置InfluxDB&#xff0c;设置SSL和密码保护 引言 InfluxDB是一个开源的时间序列数据库&#xff0c;常用于存储和查询大量时序数据。通过使用Docker&#xff0c;我们可以轻松地部署和管理InfluxDB容器&#xff0c;并配置SSL以及设置用户名和密码进行保护。本博…

【AI视野·今日Robot 机器人论文速览 第六十八期】Tue, 2 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 2 Jan 2024 Totally 12 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Edge Computing based Human-Robot Cognitive Fusion: A Medical Case Study in the Autism Spectrum Disorder Therapy Author…

对房价数据集进行处理和数据分析

大家好&#xff0c;我是带我去滑雪&#xff0c;每天教你一个小技巧&#xff01; 房价数据集通常包含各种各样的特征&#xff0c;如房屋面积、地理位置、建造年份等。通过对数据进行处理和分析&#xff0c;可以更好地理解这些特征之间的关系&#xff0c;以及它们对房价的影响程度…

prometheus grafana linux服务器监控

文章目录 前传node-exporter安装配置promethues监控node节点grafana操作查看监控&#xff1a;外传 前传 prometheus grafana的安装使用&#xff1a;https://nanxiang.blog.csdn.net/article/details/135384541 本文说下监控nginx&#xff0c;prometheus grafana linux 安装配…

ThreeJs通过canvas和Sprite添加标签

在3D场景中很多时候会用到给模型添加标签&#xff0c;以表示这个模型的代号&#xff0c;尤其是大量重复模型的时候&#xff0c;添加标签是为了更直观的看到场景中每个模型的数据和名称&#xff0c;比如在仓库中有很多货架&#xff0c;就会需要查看每个货架的编号&#xff0c;如…

LeetCode(40)组合总和Ⅱ⭐⭐

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,…

Unity 圆角 线段 绘制 LineRender

需求 绘制圆角 核心函数 /// <summary>/// 点ABC 形成的角度必须为90 点c为中间的点/// </summary>/// <param name"a"></param>/// <param name"b"></param>/// <param name"c"></param>/// &…