最初这个问题把我带到了这里:
Disable firing TextChanged event
我想知道jtmach的答案是否“干净”:
private void mytextbox_LostFocus(object sender, RoutedEventArgs e)
{
this.mytextbox.TextChanged -= this.myTextBox_TextChanged;
if(textbox.Text.ToString().Contains('.'))
{
textbox.Foreground = new SolidColorBrush(Colors.Gray);
textbox.Background = new SolidColorBrush(Colors.White);
}
this.mytextbox.TextChanged += this.myTextBox_TextChanged;
}
在这样的另一个事件中取消订阅TextChanged事件是否可以?
或者是否容易出错,因为在LostFocus期间可以调用TextChanged事件(由用户或程序调用)?
最佳答案 如果这是在多线程上下文中那么这将是一个问题.当您取消订阅时,TextChanged事件当前可能正在运行,从而阻止您在此代码也在运行时假设它正在运行.
也就是说,在这种情况下,两个方法将始终在UI线程中运行,所以虽然这个代码不会真正“破坏”(你不能同时运行文本更改事件,因为UI线程只能运行一个无论如何,这两个事件都是一样的但是它也没有用处并且可以被删除(因为当事件处理程序运行时事件不能被触发,因为它阻塞了UI线程).