Проблема обработки LostFocus

Я хочу справиться 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 равно ложному, это значит, TextBox потерял фокус не потому, что нажали enter. SomeCommand удалит некоторый элемент, который был привязан к TextBoxи оно исчезнет.

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

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

1 ответ

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

if (!isEnterClicked && !button.Focused)
{
    //do stuff
}
Другие вопросы по тегам