在 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 入门教程DispatcherTimer计时器的更多相关文章

  1. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  2. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二——Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  3. WPF入门教程系列二——Application介绍

    一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...

  4. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  5. WPF入门教程系列(一) 创建你的第一个WPF项目

    WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...

  6. WPF入门教程系列一

    WPF入门教程 一.  前言  公司项目基于WPF开发,最近项目上线有点空闲时间写一篇基于wpf的基础教材,WPF也是近期才接触,学习WPF也是在网上查资料与微软的MSDN进行学习,写本博客的目为了温 ...

  7. WPF入门教程系列十三——依赖属性(三)

    四. 只读依赖属性 在以前在对于非WPF的功能来说,对于类的属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些 WPF控件的依赖属性是只 ...

  8. WPF入门教程系列二十二——DataGrid示例(二)

    DataGrid示例的后台代码 1)  通过Entity Framework 6.1 从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,从S_ Province表中读取 ...

  9. WPF入门教程系列二十一——DataGrid示例(一)

    前面我们学习了ListView控件的使用示例,今天我们来学习DataGrid的有关知识.提到DataGrid 不管是Asp.Net中的网页开发还是WinForm应用程序开发都会频繁使用.通过它我们可以 ...

  10. WPF入门教程系列二十——ListView示例(二)

    第四步.WPF后台逻辑代码编写 在后台用Entity Framework 6.1的Code First方式获取数据库中的数据.同时,在“刷新”按钮的方法中进行数据绑定.操作步骤如下: 1)  在“刷新 ...

随机推荐

  1. redisConfig+redisUtil开箱即用

    RedisConfig @Configuration public class RedisConfig { //编写redisTemplate //固定模板,开箱即用 @Bean public Red ...

  2. java 进阶P-5.5+P-6.1

    框架加数据 以框架+数据来提高可扩展性 命令的解析是否可以脱离if-else 定义一个Handler来处理命令 用Hash表来保存命令和Handler之间的关系 抽象 Shape是什么形状 Shape ...

  3. MyBatis-Plus修改数据,会不会把其他字段置为null

    前两天在用MyBatis-Plus写了一张单表的增删改查,在写到修改的时候,就突然蹦出一个奇怪的想法. MyBatis-Plus的BaseMapper中有两个关于修改的方法.如下: int updat ...

  4. petite-vue和Vue的比较

    petite-vue不止是变得更小,它还是渐进式增强的最佳实践. Vue不构建或构建都能使用.当通过构建使用时(例如使用单文件组件),Vue预编译所有的模板,所以运行时没有再处理模板.多亏了树摇(th ...

  5. axios设置全局headers

    需求:每次请求的时候都设置token为headers非常不方便 axios提供配置全局headers 这里我主要使用的是加 一个token验证 Global axios defaults axios. ...

  6. C语言中的快排函数——qsort

    函数名 qsort(); 头文件 include<stdlib,h> 功能 对数组内的元素进行默认升序的快速排序 函数声明 void qsort( void *buf, size_t nu ...

  7. 工具-使用org.openjdk.jol查看对象在内存中的布局

    1 添加依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core& ...

  8. FineUI通过js事件条用后台方法实现弹窗

    一.html标签的onclick事件 <button type="button" class="btnUpdate" onclick="< ...

  9. 使用Hook拦截sendto函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例

    正文 重要提醒(2023-02-13):本文部分内容存在bug,目前正在调试修改,会在一段时间之后更新 重要提醒(2023-02-14):目前已修复主要bug,会在一段时间之后更新,本文计划重写大部分 ...

  10. JZOJ 4496. 【GDSOI 2016】第一题 互补约数

    \(\text{Problem}\) 求 \[\sum_{i=1}^n \sum_{d|n} \gcd(d, \frac{i}{d}) \] 有 \(n \le 10^{11}\) \(\text{A ...