2012-07-10 56 views
1

我有一个解决方案,它有两个项目,主项目和一个小的共享控件。在我们的应用程序中,某个功能会在新窗口中打开此共享控件。当窗口打开时,我想将焦点设置到此控件中的第一个组合框。将焦点放在WPF组合框上并不总是有效

在我的代码中,在加载共享控件的窗口上,在_Loaded事件结束时,我将焦点设置为该组合框。但是,在运行代码时 - 我仍然必须点击选项卡才能将“键盘”聚焦在框中(因为我必须点击选项卡然后开始输入列表中的某个项目的名称)。

如果我在这里设置一个断点,点击它,然后继续 - 它实际上是按照它应该设置的方式设置的。如果我使用WPF检查器 - IsFocused也被设置。

其他的事情注意到:

  • 如果我打标签(得到我想要的东西),然后按Tab切换回,它需要我到最后控制的形式,没有到这个未知控制。这使我相信焦点设置正确,但出于某种原因没有正确的键盘焦点。
  • 如果我尝试在代码中使用MoveNext,它实际上会选择窗口中控件以外的下一个项目。

我该如何正确设置焦点?在'main'项目的另一个组合框中,只是调用.Focus()可以正常工作。

回答

3

尝试在处理所有事件并使用QueueUserWorkItem更新绑定后推迟focus()。这样的事情:

public delegate void VoidDelegate(); 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     // Some other things to do here. 
     System.Threading.ThreadPool.QueueUserWorkItem 
         (x => this.Dispatcher.Invoke(
            new VoidDelegate(SetFocus), null)); 
    } 

    private void SetFocus() 
    { 
     MyControlIWantToSetFocusOn.Focus(); 
    } 
+0

谢谢你,我想过做这样的事情 - 但我想我也只是没有设置正确的东西。这工作得很好,我也最终试图做一个Dispatcher.BeginInvoke(新的ThreadStart(()=> {theControl.Focus();})); – jmlumpkin 2012-07-11 15:52:47