WPF用户控件交换和保留键盘焦点

WPF用户控件交换和保留键盘焦点,wpf,focus,user-controls,Wpf,Focus,User Controls,我有一个WPF窗口,左侧有一列按钮。在右侧,单击左侧按钮时显示/隐藏用户控件 我已经创建了UserControls一次,然后用按钮在它们之间切换。当我切换时,我希望将键盘焦点保持在上次用户控件可见时的位置 换句话说,我单击按钮A并显示UserControl A。如果我将键盘焦点移动到该UserControl中的文本框,然后单击按钮B,做一些工作,然后再次单击按钮A,我希望焦点位于上次在UserControl A中使用的同一文本框上 关于如何实现这一点有什么想法吗?声明一个字典,其中键是左侧按钮之

我有一个WPF窗口,左侧有一列按钮。在右侧,单击左侧按钮时显示/隐藏用户控件

我已经创建了UserControls一次,然后用按钮在它们之间切换。当我切换时,我希望将键盘焦点保持在上次用户控件可见时的位置

换句话说,我单击按钮A并显示UserControl A。如果我将键盘焦点移动到该UserControl中的文本框,然后单击按钮B,做一些工作,然后再次单击按钮A,我希望焦点位于上次在UserControl A中使用的同一文本框上


关于如何实现这一点有什么想法吗?

声明一个字典,其中键是左侧按钮之一,值是当前焦点控件。单击按钮时,获取当前关注的元素并在字典中设置它(键为先前单击的按钮)。更改显示的UserControl并读取字典,其中键为刚刚单击的按钮。如果有此项的控件,请将焦点设置为它


使用FocusManager.FocusedElement可以知道哪个控件具有焦点(实际上是一个IIInputElement,它应该是字典值的类型),使用FocusManager.SetFocusedElement可以将焦点放回(或者对控件调用focus())

太棒了。你的建议把我引向了正确的方向。我还需要弄清楚的是,我需要在所有用户控件上设置FocusManager.IsFocusScope=“True”,并将它们用作FocusManager调用中的dependency对象。然后,我按照您的逻辑,另外还必须调用UserControl上的Focus(),作为最后一步获得焦点。谢谢蒂莫雷斯!