TextBox LostFocus不会触发

我有一个LostFocus事件的问题,当我点击背景时它不会触发。我读了一些关于焦点逻辑和键盘焦点的东西但是当我只有一个时,我找不到从控件中获得焦点的方法他们

XAML:

   

C#:

  private void textBox1_LostFocus(object sender, RoutedEventArgs e) { } 

您必须使用以下隧道事件:文本框上的PreviewLostKeyboardFocus

隧道:最初,调用元素树根的事件处理程序。 然后,路由事件沿着路径行进通过连续子元素的路径,朝向作为路由事件源的节点元素(引发路由事件的元素)。 隧道路由事件通常被用作或作为控件的合成的一部分来处理,使得来自复合部件的事件可被故意抑制或由完全控制特定的事件替换。 WPF中提供的输入事件通常实现为隧道/冒泡对。 隧道事件有时也称为预览事件,因为用于对的命名约定。

以下行为将解决此问题:

 public class TextBoxUpdateOnLostKeyboardFocusBehavior : Behavior { protected override void OnAttached() { if (AssociatedObject != null) { base.OnAttached(); AssociatedObject.LostKeyboardFocus += OnKeyboardLostFocus; } } protected override void OnDetaching() { if (AssociatedObject != null) { AssociatedObject.LostKeyboardFocus -= OnKeyboardLostFocus; base.OnDetaching(); } } private void OnKeyboardLostFocus(object sender, KeyboardFocusChangedEventArgs e) { var textBox = sender as TextBox; if (textBox != null && e.NewFocus == null) { // Focus on the closest focusable ancestor FrameworkElement parent = (FrameworkElement) textBox.Parent; while (parent is IInputElement && !((IInputElement) parent).Focusable) { parent = (FrameworkElement) parent.Parent; } DependencyObject scope = FocusManager.GetFocusScope(textBox); FocusManager.SetFocusedElement(scope, parent); } } } 

您可以将它附加到TextBox,如下所示: