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(); 就是这样。