Wpf Control.Focus()和FocusManager.SetFocusedElement()之间的差异

Wpf Control.Focus()和FocusManager.SetFocusedElement()之间的差异,wpf,focus,Wpf,Focus,实际上,我想知道这一点 在某些情况下,.Focus()似乎比SetFocusedElement()更好。但另一种情况是相反的。所以我必须知道那里有什么不同的东西 此外,根据MSDN,.Focus()用于键盘焦点,SetFocusedElement用于逻辑焦点。但是我感觉不出逻辑焦点和键盘焦点之间有什么不同。使用FocusManager.SetFocusedElement(),您可以指定一个UserControl,您要在元素上设置焦点。因此,您可以将焦点设置在程序不同部分中的控件上 Control

实际上,我想知道这一点

在某些情况下,.Focus()似乎比SetFocusedElement()更好。但另一种情况是相反的。所以我必须知道那里有什么不同的东西


此外,根据MSDN,.Focus()用于键盘焦点,SetFocusedElement用于逻辑焦点。但是我感觉不出逻辑焦点和键盘焦点之间有什么不同。

使用
FocusManager.SetFocusedElement()
,您可以指定一个
UserControl
,您要在元素上设置焦点。因此,您可以将焦点设置在程序不同部分中的控件上

Control.Focus()

胡乱猜测:您不正确地使用了
FocusManager.SetFocusedElement()
,导致了不必要的行为,但归根结底,事实上是一样的


旁注:“逻辑”焦点和“键盘”焦点在WPF中。

键盘焦点通常更容易理解,因为这实际上是用户键入时接收键盘输入的控件。所以,如果你点击一个文本框,它会收到键盘焦点,你就可以开始打字了。其他控件具有其他行为,可能并不真正支持键盘,但它们仍然可以获得键盘焦点

对于逻辑焦点,应用程序可以由几个部分组成。例如,大多数应用程序的顶部都有一个工具栏/功能区,然后是其主要内容。现在,假设您的内容是一个文本框,当前具有键盘焦点。在工具栏/功能区控件中单击时,键盘焦点将移动到该控件。但是你真的想“记住”你的内容中的文本框以前有键盘焦点

为此,工具栏/功能区将创建新的“焦点范围”。因此,当您在工具栏/功能区控件中单击时,可以移动键盘焦点,但文本框仍然具有窗口的逻辑焦点。这样,当用户使用完工具栏/功能区时,文本框可以重新获得键盘焦点

如果您与另一个应用程序交互,情况也是如此,因为您的应用程序没有键盘焦点。当您回到应用程序中工作时,它使用逻辑焦点来知道谁最后拥有键盘焦点(并且应该恢复)