2013-08-05 33 views
1

我有這個小問題,但不能輕易解決。目前,我的程序有2個按鈕,一個「開始」和一個「取消」。當用戶點擊開始時,按鈕應該立即執行:在運行BackgroundWorker之前更新界面

StartButton.IsEnabled = false;

CancelButton.IsEnabled = true;

但是,只有當BackgroundWorker完成後(按下按鈕後將運行的所有代碼)纔會發生這種情況,因爲UI總是隨時更新。我無法將這些命令添加到背景工作器的「ProgressChanged」或「Completed」事件中。這些事件可能需要10分鐘才能完成。

一個簡單的方法是將這些命令添加到「ProgressChanged」部分,並在最後「完成」中再次更改其狀態。但我想避免這種情況,因爲按鈕應始終顯示其真實狀態,而不是幾次「ProgressChanged」事件之後。當然,總是有方法,比如不使用按鈕的UI屬性。

這是否有任何簡短的解決方案?

無法將Button.Property更改添加到ClickEvent。這是這方面的主要問題。我可以很容易地使用BGW的「Completed」部分來改變Button的背部以匹配起始狀態。問題是讓他們在所有事件和BGW之前立即設置。

+0

看來,最簡單的方法是將屬性更改添加到「ProgressChanged」事件的開始。但是,這並不總是最好的方法,因爲有時在觸發該方法之前可能需要很長時間,這取決於代碼提供進度信息的頻率。 – W0lfw00ds

回答

0

如果你有一個啓動按鈕,如:

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

然後如果你想在bg線程消息發送到你可以做

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(); 
    } 

UI使用Invoke方法,如here

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

    } 

,做

 if (InvokeRequired) 
    { 
     Invoke(new UpdateUIHndler(UpdateUI)); 
    } 
+0

這不會改變問題。情況完全相同,請不要使用「button1_Click」啓動BackgroundWorker的方法。然後,將先處理BackgroundWorker的命令和計算,然後用這些命令更新UI: StartButton.IsEnabled = false; CancelButton.IsEnabled = true; – W0lfw00ds

+0

@AshtonWoods那麼是什麼問題? UI卡住了嗎? –

+0

這種方法的問題是我需要等待幾分鐘才能完成BackgroundWorker。之後,UI將更新設置的配置,如屬性.IsEnabled,.Content。 – W0lfw00ds

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 
} 
+0

問題是它不起作用。代碼通過BGW進行處理,因爲它是ClickEvent的一部分。 – W0lfw00ds

+0

@AshtonWoods - 我認爲這不是一種將處理代碼保存在StartButton_Click事件中的好方法,因爲BGW在這種情況下沒有用處。您可以將代碼放入BGW的DoWork事件中,如我的帖子 – Vikram

+0

中所示。ClickEvent調用另一個Function(),其中包含所有進一步的命令,這些命令也會調用BGW。 DoWork包含所有重複命令,重複x次。 – W0lfw00ds

相關問題