WPF: как программно удалить фокус из текстового поля
Я хочу добавить простое (по крайней мере, я думал, что это было) поведение к моему WPF TextBox
.
когда пользователь нажимает Escape я хочу TextBox
он редактирует, чтобы иметь текст, который он имел, когда пользователь начал редактирование, и я хочу удалить фокус из TextBox
.
у меня нет никаких проблем с установкой текста для значения, которое он имел в начале редактирования.
проблема заключается в том, чтобы удалить фокус элемента. Я не хочу, чтобы переместить фокус на любой другой компонент, я просто хочу TextBox
терять фокус. Должен ли я иметь невидимый элемент, чтобы установить фокус так мой TextBox
может потерять фокус?
6 ответов:
в .NET Framework 4 просто
Keyboard.ClearFocus();
код, который я использую :
// Move to a parent that can take focus FrameworkElement parent = (FrameworkElement)textBox.Parent; while (parent != null && parent is IInputElement && !((IInputElement)parent).Focusable) { parent = (FrameworkElement)parent.Parent; } DependencyObject scope = FocusManager.GetFocusScope(textBox); FocusManager.SetFocusedElement(scope, parent as IInputElement);
немного опоздал на вечеринку, но это было полезно для меня, так вот он идет.
Начиная С .Net 3.0,
FrameworkElement
есть MoveFocus функция, которая сделала трюк для меня.
вы можете установить фокус на фокус предка. Этот код будет работать, даже если текстовое поле находится внутри шаблона без фокусируемых предков внутри того же шаблона:
DependencyObject ancestor = textbox.Parent; while (ancestor != null) { var element = ancestor as UIElement; if (element != null && element.Focusable) { element.Focus(); break; } ancestor = VisualTreeHelper.GetParent(ancestor); }