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