TextBox LostFocus не срабатывает - PullRequest
       1

TextBox LostFocus не срабатывает

2 голосов
/ 29 ноября 2011

У меня проблема с событием 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 ]

5 голосов
/ 29 ноября 2011

Вы должны использовать следующее событие туннелирования: PreviewLostKeyboardFocus для своего текстового поля

Туннелирование: Изначально вызываются обработчики событий в корне дерева элементов.Затем перенаправленное событие проходит маршрут через последовательные дочерние элементы вдоль маршрута к элементу узла, который является источником перенаправленного события (элемент, вызвавший перенаправленное событие).Туннелирование перенаправленных событий часто используется или обрабатывается как часть составления для элемента управления, так что события из составных частей могут быть преднамеренно подавлены или заменены событиями, характерными для всего элемента управления.Входные события, предоставляемые в WPF, часто реализуются как пара туннелирования / пузыри.События туннелирования также иногда называют событиями предварительного просмотра из-за соглашения об именах, которое используется для пар.

0 голосов
/ 02 октября 2015

Это исправит следующее поведение:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...