我已经在SO上进行了很多搜索并围绕这个问题进行了搜索,但似乎无法找到其他任何可以尝试的内容。
我有一个包含选项卡控件的MainView(窗口)。选项卡控件绑定到ChildViews的ObservableCollection(用户控件)。 MainView的ViewModel有一个方法,允许添加到ChildViews的集合,然后创建一个新的选项卡。创建新选项卡后,它将成为活动选项卡,这样可以正常工作。 MainView上的此方法是从另一个ViewModel(OtherViewModel)调用的。
我要做的是在创建新选项卡时将键盘焦点设置到选项卡上的第一个控件(来自WPFToolkit *的AutoCompleteBox)。我还需要以相同的方式设置焦点,但不要创建新选项卡(因此将焦点设置在当前活动的选项卡上)。
(*请注意,AutoCompleteBox似乎存在一些焦点问题 - 即使它确实具有焦点,您需要向其发送一个MoveNext()以将光标移动到其窗口中。我已经解决了这个问题)
所以这就是问题所在。当我不创建新选项卡时,聚焦工作,但是当我创建新选项卡时,它不起作用。两个函数都使用相同的方法来设置焦点,但创建逻辑首先调用创建新选项卡并将其设置为活动的方法。设置焦点的代码(在ChildView的Codebehind中):
IInputElement element1 = Keyboard.Focus(autoCompleteBox);
//plus code to deal with AutoCompleteBox as noted.
在任何一种情况下,Keyboard.FocusedElement都以MainView开头。在创建之后,调用Keyboard.Focus似乎什么都不做(聚焦元素仍然是MainView)。在不创建选项卡的情况下调用此选项可将键盘焦点设置为autoCompleteBox。
有什么想法吗?
更新
班德的建议是半工作的。所以现在在这两种情况下,聚焦元素都是正确的AutoCompleteBox。然后我做的是MoveNext(),它将焦点设置为TextBox。我一直认为这个文本框是AutoCompleteBox的内部,因为当发生这种情况时焦点在屏幕上正确设置。现在我不太确定。这仍然是我在不执行创建时遇到此代码时看到的行为。在创建之后,MoveNext()将焦点设置回MainView中的元素。
问题仍然必须与Bender的答案相符,其中控件的状态不同,具体取决于是否创建了新选项卡。还有其他想法吗?
最终更新
如上所述,majocha的建议奏效了。
如果有人遇到与AutoCompleteBox相同的问题,我想更新此内容。设置焦点似乎不会在UI中激活它 - 您需要在其上执行MoveNext以将焦点向前移动一次到控件的内部文本框。这是基于我的调试经验,可能不是100%科学。如果我有时间,我将尝试创建一个小的repro项目并将其提交给WPFToolkit团队。
答案 0 :(得分:3)
您可以尝试使用
延迟焦点更改Dispatcher.BeginInvoke(MyChangeFocusAction, DispatcherPriority.ContextIdle);
布局和属性更新完成后,它将排队。 我不认为这是最好的做法,但它对我有用。
答案 1 :(得分:1)
控件必须是可见的才能被聚焦,您可以尝试通过订阅IsVisibleChanged事件来推迟聚焦,类似于以下内容应该有效:
public static void setFocusLate(this Control control)
{
DependencyPropertyChangedEventHandler handler = null;
handler = delegate
{
control.Focus();
control.IsVisibleChanged -= handler;
};
control.IsVisibleChanged += handler;
}