2014-09-18 93 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