jps*_*res 87 wpf textbox focus
我想在我的WPF中添加一个简单的(至少我认为是)行为TextBox.
当用户按Escape时,我希望TextBox他正在编辑以获得用户开始编辑时所具有的文本,并且我想从中移除焦点TextBox.
我没有任何问题为编辑开头的值设置文本.
问题是要删除元素的焦点.我不想把焦点转移到任何其他组件,我只是想TextBox失去焦点.我是否必须有一个不可见的元素来设置焦点,以便我TextBox可以失去焦点?
LPL*_*LPL 136
在.NET Framework 4中 Keyboard.ClearFocus();
dec*_*jau 52
我一直在使用的代码:
// 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);
Run Code Online (Sandbox Code Playgroud)
您可以将焦点设置为可聚焦的祖先.即使文本框位于同一模板内没有可聚焦祖先的模板内,此代码也能正常工作:
DependencyObject ancestor = textbox.Parent;
while (ancestor != null)
{
var element = ancestor as UIElement;
if (element != null && element.Focusable)
{
element.Focus();
break;
}
ancestor = VisualTreeHelper.GetParent(ancestor);
}
Run Code Online (Sandbox Code Playgroud)
由于以上答案均不适用于我,并且接受的答案仅对键盘焦点有效,因此我采用以下方法:
// Kill logical focus
FocusManager.SetFocusedElement(FocusManager.GetFocusScope(textBox), null);
// Kill keyboard focus
Keyboard.ClearFocus();
Run Code Online (Sandbox Code Playgroud)
同时杀死逻辑和键盘焦点。
对我来说,这相当棘手,尤其是与 LostFocus 绑定一起使用时。但是,我的解决方法是添加一个空标签并关注它。
<Label Name="ResetFocusArea" Focusable="True" FocusVisualStyle="{x:Null}" />
Run Code Online (Sandbox Code Playgroud)
...
OnKeyDown(object sender, RoutedEventArgs e)
{
//if is Esc
ResetFocusArea.Focus();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66868 次 |
| 最近记录: |