WPF C#中如何将DispatchTimer绑定到按钮实现下载状态实时查询
实现步骤及代码示例
首先在你当前页面的后台代码中声明DispatcherTimer全局成员,以及可选的状态标识避免重复初始化:
using System.Windows.Threading; // 必须引入的命名空间 // 你的Window或UserControl类 public partial class DownloadPage : Window { // 声明DispatcherTimer全局实例 private DispatcherTimer _downloadQueryTimer; // 可选:标记当前是否正在查询状态 private bool _isQuerying = false; public DownloadPage() { InitializeComponent(); // 也可以在构造里提前初始化定时器,可按个人习惯调整 } }
按钮绑定逻辑
你可以直接在XAML中给按钮绑定Click事件,MVVM模式下绑定命令也可,这里用最通用的Click事件举例:
<!-- XAML 中的按钮定义 --> <Button x:Name="DownloadQueryBtn" Content="开始查询下载状态" Click="DownloadQueryBtn_Click"/> <!-- 可选:用来展示实时状态的文本控件 --> <TextBlock x:Name="StatusTxt"/>
接下来实现点击事件和定时器逻辑:
private void DownloadQueryBtn_Click(object sender, RoutedEventArgs e) { if (!_isQuerying) { // 首次点击:初始化并启动定时器 _downloadQueryTimer = new DispatcherTimer(); // 设置查询间隔,这里设为3秒,可按需调整 _downloadQueryTimer.Interval = TimeSpan.FromSeconds(3); // 绑定定时触发的查询方法 _downloadQueryTimer.Tick += QueryDownloadStatus; // 启动定时器 _downloadQueryTimer.Start(); // 更新状态和按钮文本 _isQuerying = true; DownloadQueryBtn.Content = "停止查询"; } else { // 再次点击:停止定时器 _downloadQueryTimer.Stop(); _downloadQueryTimer.Tick -= QueryDownloadStatus; _downloadQueryTimer = null; // 重置状态和按钮文本 _isQuerying = false; DownloadQueryBtn.Content = "开始查询下载状态"; StatusTxt.Text = "已停止状态查询"; } } // 定时触发的下载状态查询方法 private void QueryDownloadStatus(object sender, EventArgs e) { // 这里调用你已有的下载状态查询逻辑 string currentStatus = GetDownloadStatus(); // 替换成你自己的实现方法 // DispatcherTimer的Tick事件运行在UI线程,可直接更新UI无需额外跨线程调度 StatusTxt.Text = $"当前下载状态:{currentStatus}"; // 可选逻辑:下载完成/失败后自动停止定时器 if (currentStatus is "下载完成" or "下载失败") { DownloadQueryBtn_Click(null, null); // 复用停止逻辑即可 } } // 这是你原有获取下载状态的方法,替换成自己的实现即可 private string GetDownloadStatus() { // 你的原有业务逻辑 return "下载中"; }
注意事项
DispatcherTimer的Tick事件默认运行在UI线程,直接修改控件属性不会报跨线程异常,刚好适配WPF的UI更新需求- 定时器停止时记得解绑
Tick事件,避免内存泄漏 - 如果你的下载状态查询是耗时IO操作,可以把
GetDownloadStatus改成异步方法用await调用,不会卡住UI - MVVM模式下把定时器逻辑移到ViewModel中,按钮绑定ICommand、状态用绑定属性更新即可,核心逻辑完全一致
内容的提问来源于stack exchange,提问作者Stanko Maksimovic
相关产品推荐
相关产品推荐

