2014-09-18 95 views
0

我不知道我是否正確闡述了這個問題,但讓我解釋一下。爲了使事情變得簡單,我將按鈕添加到WPF中。啓動按鈕,具有下面的代碼如何不阻止按鈕的控制?

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     int x = 0; 
     while (r ==false) 
     { 
      lstBox.Items.Add(x++); 
     } 
    } 

和按鈕停止:

private void btnStop_Click(object sender, RoutedEventArgs e) 
    { 
     r = true; 
    } 

「R」 是一個全球性的布爾變量。

每當點擊開始,我不能再點擊停止按鈕。

你知道如何使按鈕停止活動或「clickeable」無論執行什麼?

+0

您正在阻止ui線程,因爲您無限循環它。您可能需要考慮對此或後臺工作者類使用任務並行庫。 – Charleh 2014-09-19 00:05:14

+0

我會查看後臺工作者類。謝謝。 – user3397856 2014-09-19 02:40:25

回答

2
delegate void Work(); 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    new Work(WorkOne).BeginInvoke(null, null); 
} 

private void WorkOne() 
{ 
    int x = 0; 
    while (r == false) 
    { 
     listBox.Dispatcher.Invoke(new Action(() =>{ listBox.Items.Add(x++); })); 
     System.Threading.Thread.Sleep(x); 
    } 
} 

private void btnStop_Click(object sender, RoutedEventArgs e) 
{ 
     r = true; 
} 
0

看起來像你卡在一個無限循環。而(r == false)始終在運行,不允許您使用停止按鈕。你的循環結構需要某種退出。

1

這並不像看起來那麼微不足道。你需要釋放循環的wpf線程,以便處理其他事件並對其他按鈕作出反應。在那裏有很多知識來實現​​它。 谷歌backgoundworker類或任務異步等待(對於vs2012和更新)。但也有一個替代和簡單的黑客:谷歌Windows窗體doevents()你也可以從wpf調用它。但是一旦你的程序變得更加複雜,這將變得非常難以維護。

+0

謝謝你的迴應。我其實想要一些方向,你就是這麼做的。 – user3397856 2014-09-19 02:39:33