将WPF按钮变为“取消”;执行时按钮
本文关键字:按钮 执行 取消 WPF | 更新日期: 2023-09-27 17:49:40
我有一个标记为"Check"的按钮,它在后台工作块中执行长时间运行的检查:
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
runCheck();
};
现在,当检查正在运行时,我禁用按钮:
CheckButton.IsEnabled = false;
但是我想做的是把"检查"按钮变成一个"取消"按钮。dowork任务,它目前正在执行,所以用户可以取消,如果需要的话。然后,一旦取消,按钮将恢复到原来的"检查"形式。这可能吗?
我觉得您有两个问题:如何将按钮更改为取消按钮以及如何使用该按钮实际取消任务。将按钮更改为"取消"非常简单,可以使用
完成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方法
输入链接描述