2010-04-08 31 views
1

我已经在SO和谷歌周围搜索了很多关于这个问题的搜索,但似乎找不到其他任何东西来尝试。当创建新标签页时WPF焦点在标签控件内容

我有一个包含选项卡控件的MainView(窗口)。选项卡控件绑定到ChildViews(用户控件)的ObservableCollection。 MainView的ViewModel有一个方法,允许添加到ChildViews的集合,然后创建一个新的选项卡。当一个新的选项卡被创建时,它将成为活动选项卡,并且工作正常。 MainView上的此方法是从另一个ViewModel(OtherViewModel)调用的。

我想要做的是在创建新选项卡时将键盘焦点设置为选项卡上的第一个控件(来自WPFToolkit *的AutoCompleteBox)。我也需要以同样的方式设置焦点,但不创建新的选项卡(因此将焦点设置在当前活动的选项卡上)。 (*注意,似乎有一些AutoCompleteBox的焦点问题 - 即使它确实有焦点,你需要发送一个MoveNext()给它来获取光标在它的窗口中。我已经解决了这个问题。 )。

所以,这是问题所在。当我没有创建新选项卡时,对焦工作正常,但当我创建新选项卡时,对焦不起作用。两个函数都使用相同的方法来设置焦点,但创建逻辑首先调用创建新选项卡并将其设置为活动的方法。这将焦点设置(在ChildView的代码隐藏)代码:

 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中的元素。

该问题仍然必须沿着本德答案的线,其中控件的状态是不一样取决于是否创建一个新的选项卡。任何其他想法?

最后更新

如前所述,majocha的建议的工作。

我想更新这个以防万一任何人遇到与AutoCompleteBox相同的问题。似乎设置焦点不会在用户界面中激活它 - 您需要在其上执行MoveNext以将焦点向前移动一次到控件的内部文本框。这是基于我的调试经验,这可能不是100%科学的。如果我有时间,我会尝试创建一个小型repro项目并将其提交给WPFToolkit团队。

回答

3

你可以尝试defering与

对焦变化
Dispatcher.BeginInvoke(MyChangeFocusAction, DispatcherPriority.ContextIdle); 

布局和属性更新完成后,它将被排队。 我不认为这是最佳做法,但它适用于我。

+0

工作!谢谢你的帮助。 – 2010-04-09 13:45:12

1

控制必须是可见的重点,您可以尝试推迟通过订阅IsVisibleChanged在事件聚焦,类似下面的东西应该工作:

public static void setFocusLate(this Control control) 
     { 
      DependencyPropertyChangedEventHandler handler = null; 

      handler = delegate 
       { 
        control.Focus(); 
        control.IsVisibleChanged -= handler; 
       }; 

      control.IsVisibleChanged += handler; 
     } 
+0

感谢您的回答。如果你有机会看到我的更新。 – 2010-04-08 21:18:20

相关问题