TextBox LostFocus不会触发

时间:2011-11-29 15:16:59

标签: c# wpf

我遇到LostFocus事件的问题,当我点击背景时它不会触发。我读了一些关于焦点逻辑和键盘焦点的东西但是我找不到一种方法来从控件那里得到焦点就像文本框一样只是其中之一

XAML:

<Grid Height="500" Width="500">
    <TextBox Height="23" Width="120" Margin="12,12,0,0" Name="textBox1" LostFocus="textBox1_LostFocus"  />
</Grid>

C#:

    private void textBox1_LostFocus(object sender, RoutedEventArgs e)
    {

    }

2 个答案:

答案 0 :(得分:5)

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

  

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

答案 1 :(得分:0)

以下行为将解决此问题:

public class TextBoxUpdateOnLostKeyboardFocusBehavior : Behavior<TextBox>
{
    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:

 <TextBox>
    <i:Interaction.Behaviors>
        <behaviors1:TextBoxUpdateOnLostKeyboardFocusBehavior />
    </i:Interaction.Behaviors>              
</TextBox>