在循环运行时,如何根据CheckBox Checked值取消循环?

时间:2011-11-14 16:54:52

标签: silverlight windows-phone-7

让我们说如果用户选择名为“repeat”的CheckBox,我想重复调用一个函数,但是一旦用户“取消选中”CheckBox,就会停止对该函数的调用。

我尝试使用CheckBox的'Checked','Click'和'Tap'事件,但是一旦循环开始,它就不会感知复选框状态的任何变化。

我甚至尝试在另一个按钮的_Click方法中使用循环,但随后会在Button的“按下”状态下创建一个锁。

任何想法/替代建议?

2 个答案:

答案 0 :(得分:0)

在UI线程上循环旋转是不好的做法。为什么不绑定到依赖项属性,然后在PropertyChangedCallback

中执行您需要的操作

XAML

<!-- MainWindowInstance is the x:Name of this class, you can avoid setting the -->
<!-- ElementName if you setup a DataContext -->
<CheckBox Content="Repeat" IsChecked="{Binding ElementName=MainWindowInstance, Path=Checked, Mode=TwoWay}" />

代码隐藏

public bool Checked
{
   get { return (bool)GetValue(CheckedProperty); }
   set { SetValue(CheckedProperty, value); }
}

public static readonly DependencyProperty CheckedProperty = DependencyProperty.Register("Checked", typeof(bool), typeof(MainPage), new PropertyMetadata((s, e) =>
{
   if ((bool)e.NewValue)
   {
      // Checked
      MessageBox.Show("checkbox checked");
   }
   else
   {
      // Unchecked
   }
}));

答案 1 :(得分:0)

不要使用循环,使用Timer并根据复选框状态打开和关闭它。

    // your loop replacement: a timer
    Timer timer;

    // this method is called periodically by the timer - do whatever you want here
    // but make sure you use proper dispatching when accessing the UI (!)
    private void MyTimerCallback(object state)
    {
        System.Diagnostics.Debug.WriteLine("Action!");
    }

    // this creates and starts the timer
    private void StartTimer()
    {
        // set the timer to call your function every 500ms
        timer = new Timer(MyTimerCallback, null, 500, 500);
    }

    // stop the timer
    private void StopTimer()
    {
        timer.Dispose();
    }

    // Checked handler for the checkbox: start the timer
    private void checkBox1_Checked(object sender, RoutedEventArgs e)
    {
        StartTimer();
    }

    // Unchecked handler for the checkbox: stop the timer
    private void checkBox1_Unchecked(object sender, RoutedEventArgs e)
    {
        StopTimer();
    }

关于回调的一些注释(“MyTimerCallback”):

  

该方法不会在创建计时器的线程上执行;它   在系统提供的ThreadPool线程上执行。   (来源:Timer的文件)

这很重要,它告诉您不要直接从此方法访问任何UI元素。做这样的事情:

textBlock1.Dispatcher.BeginInvoke(() => { textBlock1.Text = "Changed text"; });