You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:15:08