Проблема обработки LostFocus - PullRequest
1 голос
/ 20 июля 2011

Я хочу обработать LostFocus событие TextBox для выполнения некоторых действий. Но я также не хотел бы выполнять эти действия, если TextBox потерял фокус, потому что специальный Button (который открывает OpenFileDialog) был нажат или Key.Enter был пойман. При нажатии Key.Enter, прежде всего, возникает событие KeyDown. Вот мой обработчик событий KeyDown:

public void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e != null && sender != null)
        if (e.Key == System.Windows.Input.Key.Enter && !String.IsNullOrWhiteSpace(((TextBox)sender).Text))
        {
            e.Handled = true;
            isEnterClicked = true;
            ((System.Windows.Controls.TextBox)sender).Visibility = System.Windows.Visibility.Collapsed;
        }
}

После нажатия Key.Enter, TextBox.Visibility изменяется, и этот оператор вызывает событие LostFocus.

public void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
    try
    {
        if (!isEnterClicked)
        {
            DependencyObject dob = (DependencyObject)sender;
            while ( !(dob is ItemsControl))
            {
                dob = VisualTreeHelper.GetParent(dob);
            }
            dynamic myCmd = dob.GetValue(Control.DataContextProperty);
            myCmd.SomeCommand.Execute(((TextBox)sender).GetValue(Control.DataContextProperty));
        }
    }
    finally
    {
        isEnterClicked = false;
    }
}
Обработчик

LostFocus в первую очередь следит за тем, равно ли isEnterPressed значению false, его среднее значение, TextBox потеряло фокус не потому, что была нажата кнопка ввода. SomeCommand удалит некоторый предмет, который был привязан к TextBox, и исчезнет.

Q: Итак, как сделать то же самое с событием Button.Click?

Прежде всего, ДО Button нажал, TextBox потерял фокус. Точно так же не приемлемо. Button.Focusable="False", создание нового ControlTemplate или обработка Timer.Elapsed события не удовлетворяют моим требованиям.

1 Ответ

0 голосов
/ 20 июля 2011

Если я правильно понял проблему, попробуйте проверить, сфокусирована ли кнопка, если это не так, не выполняйте действия в событии потерянного фокуса в текстовом поле.Если правильная кнопка Iam должна быть сфокусирована до того, как произойдет событие потерянного фокуса в текстовом поле.

if (!isEnterClicked && !button.Focused)
{
    //do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...