4

最初这个问题把我带到了这里: 禁用触发 TextChanged 事件

我想知道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-events 吗?

或者它是否容易出错,因为在 LostFocus 期间可以调用 TextChanged 事件(由用户或程序)?

4

1 回答 1

2

如果这是在多线程上下文中,那么这将是一个问题。当您取消订阅时,该TextChanged事件可能当前正在运行,从而阻止您假设它正在运行,而该代码也在运行。

也就是说,在这种情况下,这两种方法都将始终在 UI 线程中运行,因此虽然这段代码不会真正被“破坏”(您不能同时运行文本更改事件,因为 UI 线程只能运行一个无论如何同时发生这两个事件),但它也没有任何目的,只能被删除(因为在此事件处理程序运行时无法触发该事件,因为它阻塞了 UI 线程)。

于 2013-06-26T16:41:18.867 回答