WPF: как программно удалить фокус из текстового поля


Я хочу добавить простое (по крайней мере, я думал, что это было) поведение к моему WPF TextBox.

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

у меня нет никаких проблем с установкой текста для значения, которое он имел в начале редактирования.

проблема заключается в том, чтобы удалить фокус элемента. Я не хочу, чтобы переместить фокус на любой другой компонент, я просто хочу TextBox терять фокус. Должен ли я иметь невидимый элемент, чтобы установить фокус так мой TextBox может потерять фокус?

6 74

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);
}

насколько я знаю, это не возможно, чтобы полностью удалить фокус. Что-то в вашем окне всегда будет иметь фокус.

в разработке Windows Phone, я только что сделал Focus() или this.Focus() на PhoneApplicationPage и он работал как шарм.