将WPF按钮变为“取消”;执行时按钮

本文关键字:按钮 执行 取消 WPF | 更新日期: 2023-09-27 17:49:40

我有一个标记为"Check"的按钮,它在后台工作块中执行长时间运行的检查:

worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            runCheck();               
        };

现在,当检查正在运行时,我禁用按钮:

CheckButton.IsEnabled = false;

但是我想做的是把"检查"按钮变成一个"取消"按钮。dowork任务,它目前正在执行,所以用户可以取消,如果需要的话。然后,一旦取消,按钮将恢复到原来的"检查"形式。这可能吗?

将WPF按钮变为“取消”;执行时按钮

我觉得您有两个问题:如何将按钮更改为取消按钮以及如何使用该按钮实际取消任务。将按钮更改为"取消"非常简单,可以使用

完成
CheckButton.Content = "Cancel";

如果你想从一个单独的线程(如后台工作线程)改变按钮的Content,那么你需要使用它的调度程序来处理这个

CheckButton.Dispatcher.BeginInvoke(() => {CheckButton.Content = "Cancel";});

至于实际取消长时间运行的任务,您需要在任务本身中设置一个特定的机制,为您提供一种显式停止它的方法。您可以在线程上手动设置它,但这是一个非常糟糕的主意。如果它是一个重复的活动,如循环或长操作,您可以让它检查bool

public bool CancelTask = false;

在点击事件中,你可以这样做:

if (CheckButton.Content.ToString() == "Check")
{  
   worker.DoWork += delegate(object s, DoWorkEventArgs args)
    {
        runCheck();               
    };
   CheckButton.Content = "Cancel";
}
else 
{ 
   CancelTask = true;
   //Some code to wait for the task to finish canceling, then set CancelTask back to false
   CheckButton.Content = "Check";
}

那么在你的任务中你需要像

这样的东西
if (CancelTask) return; //Or something to stop the task early

我只是担心您会遇到交叉线程场景,请仔细查看一些方法"过去我已经成功地使用了ReportProgress方法

输入链接描述