C# 以编程方式销毁/完全删除焦点

C# 以编程方式销毁/完全删除焦点,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,如果我想把焦点从某件事上完全移开,就像说焦点相反;在代码中,我将如何着手执行它 示例场景:我在键盘上对焦一个按钮,并使用onclick事件,我只想说从此元素中移除焦点。将所需元素的Focusable属性设置为false 在windows中,始终有一个元素具有焦点。所以你不能移除焦点,但你可以将它转移到其他地方。您可以将焦点设置为没有任何功能的内容,例如表单本身,您可以随时使用: 键盘。清晰焦点 您可能无法直接移除焦点,但是!您可以将焦点切换到其他应用程序 [DllImport("USER32.d

如果我想把焦点从某件事上完全移开,就像说焦点相反;在代码中,我将如何着手执行它


示例场景:我在键盘上对焦一个按钮,并使用onclick事件,我只想说从此元素中移除焦点。

将所需元素的Focusable属性设置为false

在windows中,始终有一个元素具有焦点。所以你不能移除焦点,但你可以将它转移到其他地方。您可以将焦点设置为没有任何功能的内容,例如表单本身,您可以随时使用:


键盘。清晰焦点

您可能无法直接移除焦点,但是!您可以将焦点切换到其他应用程序

[DllImport("USER32.dll")]
static extern bool SetForegroundWindow (IntPtr hWnd);

private void SwitchFocusTo(Process diffProcess)
{
    SetForegroundWindow(diffProcess.MainWindowHandle);
}
在.NETFramework4中

然而,我发现这并不总是有效的。。。因此,要么将焦点全部放在另一个元素上,要么尝试以下代码:

// Move to a parent that can take the focus
FrameworkElement parent = (FrameworkElement)yourElement.Parent;
while (parent != null && parent is IInputElement && ! ((IInputElement)parent).Focusable)
{
    parent = (FrameworkElement)parent.Parent;
}

DependencyObject scope = FocusManager.GetFocusScope(yourElement);
FocusManager.SetFocusedElement(scope, parent as IInputElement);

聚焦另一个控件如何?可能与我之前所做的相同-我会聚焦“下一个”控件,但这并不理想,因为纯粹的视觉原因。我的实际目标是立即将按钮再次聚焦到下一行。这是为了修复按钮动画流动性中的错误。问题是,下一个控件会在短时间内轻微抖动,从而获得焦点并相应地设置动画。理想情况下,我希望焦点被销毁/删除,但一个好的选择是只关注最近的家长内容控制视图的主机,因为这不会有任何视觉问题。我认为OP指的是避免控件被聚焦,但不确定。我知道这一点;到目前为止,我知道只要焦点被“破坏”,它就会像避雷针一样跳到承载给定视图的contentpresenter/contentcontrol上,这是绝对正确的。这次交流只是暂时的,你是冠军,谢谢。事实上,我以前看过这个说明,但我一辈子都记不住了。遗憾的是,你回答我的问题“太快了”,所以我不得不等5分钟才能确认你的答案是否被接受。很高兴终于帮了忙。我在这里得到了很多帮助,很高兴能给我一些帮助它杀死了关键的手势绑定。e、 g.在键盘后设置Ctrl+F搜索对话框。ClearFocus在单击窗口中的任何位置之前不会触发该对话框。