WPF:如何以编程方式从文本框中删除焦点

我想添加一个简单的(至less我认为是)行为,我的WPF TextBox

当用户按下Escape时,我想让他编辑的TextBox具有用户开始编辑时的文本,并且我想从TextBox移除焦点。

我没有任何问题设置它的编辑开始时的值的文本。

问题是要消除元素的焦点。 我不想将焦点移动到任何其他组件,我只是希望TextBox失去焦点。 我必须有一个不可见的元素来设置焦点,所以我的TextBox可以失去焦点?

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

AFAIK,这是不可能完全消除焦点。 你窗口中的东西总是有焦点。

在Windows Phone开发中,我只是在PhoneApplicationPage中执行了Focus()this.Focus() ,它像一个魅力一样工作。

Keyboard.ClearFocus(); 就是这样。