长春火车站停车场收费标准,个人网站可以做论坛,桂林象鼻山照片,公司网站建设规划https://www.zhihu.com/tardis/bd/art/430630047?source_id1001 在 WinForms 中#xff0c;有一个名为 Timer 的控件#xff0c;它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性#xff0c;但我们有DispatcherTimer控件#xff0c;而不是不可见的控件。它几…https://www.zhihu.com/tardis/bd/art/430630047?source_id1001 在 WinForms 中有一个名为 Timer 的控件它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性但我们有DispatcherTimer控件而不是不可见的控件。它几乎做同样的事情但不是将它放在表单上而是专门从代码隐藏代码中创建和使用它。
DispatcherTimer 类的工作方式是指定一个时间间隔然后订阅每次满足该时间间隔时将发生的Tick事件。在调用Start()方法或将IsEnabled属性设置为 true之前不会启动 DispatcherTimer 。
让我们尝试一个简单的例子我们使用 DispatcherTimer 创建一个数字时钟
Window x:ClassWpfTutorialSamples.Misc.DispatcherTimerSamplexmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlTitleDispatcherTimerSample Height150 Width250GridLabel NamelblTime FontSize48 HorizontalAlignmentCenter VerticalAlignmentCenter //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开源项目