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

时间:2014-03-12 00:08:30

标签: c# wpf

我有一个标有" Check"的按钮。在后台工人区块中执行长时间运行检查:

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

现在,当支票运行时,我禁用了按钮:

CheckButton.IsEnabled = false;

但我想做的是转过"检查"按钮进入"取消"它正在执行的.DoWork任务按钮,因此用户可以根据需要取消。然后一旦取消,按钮将恢复到原来的状态" Check"形成。这可能吗?

2 个答案:

答案 0 :(得分:1)

我得到的印象是你有两个问题:如何将按钮更改为取消按钮,以及如何使用该按钮实际取消任务。更改按钮以显示“取消”非常简单,可以使用

完成
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

答案 1 :(得分:0)

我只是担心你会遇到一个交叉线程场景,仔细看看一些方法& BackgroundWorker类提供的事件我已经成功使用了ReportProgress方法

enter link description here