Проблема обработки 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
}