当前位置: 首页 > news >正文

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.lryc.cn/news/274163.html

相关文章:

  • 【教学类-43-04】20231229 N宫格数独4.0(n=2,4,6,8) (ChatGPT AI对话大师生成 回溯算法)
  • WPF美化ItemsControl1:不同颜色间隔
  • 查看进程对应的路径查看端口号对应的进程ubuntu 安装ssh共享WiFi设置MyBatis 使用map类型作为参数,复杂查询(导出数据)
  • 医院信息系统集成平台—安全保障体系
  • 【信息论与编码】习题-填空题
  • 二叉树的层序遍历经典问题(算法村第六关白银挑战)
  • 信息学奥赛一本通:装箱问题
  • ReactNative 常见问题及处理办法(加固混淆)
  • 算法基础之合并果子
  • CSS 使用技巧
  • typescript,eslint,prettier的引入
  • web前端javaScript笔记——(7)Math和Date方法
  • 深入理解Java中资源加载的方法及Spring的ResourceLoader应用
  • 实时记录和查看Apache 日志
  • Java实战项目五:文本冒险游戏
  • docker_ROS的usb_cam使用与标定
  • 记一次RabbitMQ服务器异常断电之后,服务重启异常的处理过程
  • rime中州韵小狼毫 help lua Translator 帮助消息翻译器
  • C++完成使用map Update数据 二进制数据
  • ARCGIS PRO SDK 访问Geometry对象
  • 数据结构之各大排序(C语言版)
  • c++ 中多线程的使用
  • 理解二叉树的遍历(算法村第七关白银挑战)
  • 所有单片机使用的汇编语言是统一的吗?
  • C ++类
  • STM32疑难杂症
  • GIT使用简介
  • easycode 插件配置文件
  • elasticsearch系列四:集群常规运维
  • 6.6 会话与输入事件(三)