1

我有这个非常小的问题,但不能轻易解决。目前,我的程序有 2 个按钮,一个“开始”和一个“取消”。当用户单击开始时,按钮应该立即消失:

StartButton.IsEnabled = false;

CancelButton.IsEnabled = true;

但这只有在 BackgroundWorker 完成时才会发生(按下按钮后将运行的所有代码),因为 UI 总是最后更新。我无法将这些命令添加到后台工作程序的“ProgressChanged”或“Completed”事件中。这些事件最多可能需要 10 分钟才能完成。

一种简单的方法是将这些命令添加到“ProgressChanged”部分,最后“完成”再次更改它们的状态。但我想避免这种情况,因为按钮应该一直显示它们的真实状态,而不是在几次“ProgressChanged”事件之后。当然总有办法,比如不使用按钮的 UI 属性。

有什么简短的解决方案吗?

将 Button.Property 更改添加到 ClickEvent 不起作用。这是其中的主要问题。我可以轻松地使用 BGW 的“已完成”部分来更改 Button 的背面以匹配起始状态。问题是在所有事件和 BGW 之前将它们设置好。

4

3 回答 3

0

如果您有一个开始按钮,例如:

this.StartButton = new System.Windows.Forms.Button();

那么你可以做

this.StartButton.Click += new System.EventHandler(this.button1_Click);

然后做

  private void button1_Click(object sender, EventArgs e)
  {
     StartButton.IsEnabled = false;

     CancelButton.IsEnabled = true;
     Thread bg = new Thread(new ThreadStart( UpdateDatabase()));
     bg.Start();
  }

如果您希望bg线程向 UI 发送消息,请使用此处Invoke的方法

  public delegate void UpdateUIHndler();
  public void UpdateUI()
  {

  }

     if (InvokeRequired)
     {
        Invoke(new UpdateUIHndler(UpdateUI));
     }
于 2013-08-05T08:28:24.160 回答
0

看看我以前的问题(非常相似)。我应该选择选项1。

代码运行时的 ASP.NET 应用程序日志/进度条

UI 只会延迟 5 秒。使用 AJAX 代替文本更新按钮样式。

于 2013-08-05T08:31:48.507 回答
0

您可以在该按钮本身的单击事件中禁用开始按钮,并在 BGW 的 RunWorkerCompleted 事件中再次启用它,如下所示

BackgroundWorker _worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(_worker_DoWork);

private void StartButton_Click(object sender, RoutedEventArgs e)
{
   startButton.IsEnabled = false;
}

 void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
    stratButton.IsEnabled = true;
 }

void _worker_DoWork(object sender, DoWorkEventArgs e)
{
  //Your processing code
}
于 2013-08-05T08:48:12.393 回答