首页 > 其他分享 >WPF 入门教程DispatcherTimer计时器

WPF 入门教程DispatcherTimer计时器

时间:2022-10-14 10:23:53浏览次数:46  
标签:入门教程 System timer 计时器 using DispatcherTimer WPF Tick

在 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 。

标签:入门教程,System,timer,计时器,using,DispatcherTimer,WPF,Tick
From: https://www.cnblogs.com/tanxwuwang/p/16790726.html

相关文章

  • WPF 模仿V_S_Co_d_e
    WPF简单模仿V_S_C_o_de开源具体功能也不多,难度也不大,自定义了若干控件实现以上程序:CusWindow:自定义窗体,WindowChrome方案,用于添加HeaderContent在标题中显示内容......
  • PCL 入门教程 - 官方文档翻译
    介绍以下链接描述了一组基本PCL教程。请注意,他们的源代码可能已经作为PCL常规版本的一部分提供,因此在开始复制和粘贴代码之前请检查那里。下面的教程列表是根据git存储库......
  • 如何在WPF中使用矢量图标
    WPF中除了可以用传统的图片格式(jpg,png)做中控件的图标外,更常见的时使用Geometry作为图标。本文将讲解如何从网上找到svg数据,然后嵌入到WPF里。准备数据阿里矢量图【提......
  • WPF listbox中添加index
    关键代码:如果中在ItemsControl中加入Index,"RelativeSource={RelativeSourceAncestorType=ListBoxItem}"可以写成,"RelativeSource={RelativeSourceTemplatedParent}"但是......
  • WPF ListBox添加新数据时自动滚到最后一行
    Xaml文件代码如下:<ListBoxx:Name="lstBox"Height="200"AlternationCount="100000"ItemsSource="{BindingLogs}"><List......
  • 【WPF】应用程序 本地化
    本地化就是根据不同地区语言显示不同的文字。本文环境:vs2022+.net6.0新的本地化方式使用资源字典,然后动态引用资源字典,以下以UI界面汉化为例:新建一个文件夹 Languag......
  • WPF之界面出现锯齿形的噪点
    项目中出现重启电脑后(软件自动启动)点击软件界面时偶尔出现锯齿噪点现象,最后发现是图片硬解码绘制的BUG。使用软解就可以避开。处理方法:在窗口的Loaded事件加这句varhw......
  • Logstash入门教程
    前言在线调试工具:​​http://grokdebug.herokuapp.com/​​一个例子input{file{path=>"/data/mosh/logstash-6.2.4/logs/test.log"#下面2个配置......
  • An ItemsControl is inconsistent with its items source - WPF Listbox
    AnItemsControlisinconsistentwithitsitemssource-WPFListbox 原来代码这么写的privateICollection<string>filterList=newList<string>();    ......
  • gdb入门教程大全(清晰明了)
    gdb介绍gdb只是众多调试器中的一个,但是它是用得最多的,所以有必要了解一下。gdb和gcc一样,都属于gnu开源家族工具链,所以gdb对gcc编译后的程序的调试支持最好。学习一个工具,当......