此代碼的問題是doSomeThing()
方法在UI線程中運行。所以,按鈕沒有正確禁用。如果我們重構代碼以便doSomeThing()
方法在不同的線程中運行,它將會正常工作。這是一個簡單的例子,使用BackgroundWorker
;然而,這個想法是我們不應該在UI線程中運行耗時的東西。下面是重構代碼:
public partial class ButtonEnableTest : Window
{
private BackgroundWorker worker = new BackgroundWorker();
public ButtonEnableTest()
{
InitializeComponent();
this.worker.DoWork += new DoWorkEventHandler(worker_DoWork);
this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (this.btn.IsEnabled == false)
{
this.btn.IsEnabled = true;
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
doSomeThing();
}
private void doSomeThing()
{
int i = 5;
while (i > 0)
{
Thread.Sleep(TimeSpan.FromMilliseconds(2000));
System.Diagnostics.Debug.WriteLine("Woke up " + i);
i--;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button) sender;
System.Diagnostics.Debug.WriteLine("at ButtonClick");
if (btn.IsEnabled)
{
btn.IsEnabled = false;
this.worker.RunWorkerAsync();
}
}
}
我沒有跟任何編碼轉換這裏我只是想分享我的想法。請注意,我將WPF按鈕命名爲「btn」。
按鈕實際上是否在點擊時更改爲禁用的視覺效果?如果沒有,你的問題可能類似於[這個問題](http://stackoverflow.com/questions/9519295/updatelayout-on-wpf-click/9519860#9519860) – ianschol 2012-03-02 03:10:08
是的,它改變視覺外觀以禁用 – HelloWorld 2012-03-02 03:12:33