让我们说如果用户选择名为“repeat”的CheckBox,我想重复调用一个函数,但是一旦用户“取消选中”CheckBox,就会停止对该函数的调用。
我尝试使用CheckBox的'Checked','Click'和'Tap'事件,但是一旦循环开始,它就不会感知复选框状态的任何变化。
我甚至尝试在另一个按钮的_Click方法中使用循环,但随后会在Button的“按下”状态下创建一个锁。
任何想法/替代建议?
答案 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"; });