【问题标题】:WPF Focus In Tab Control Content When New Tab is Created创建新选项卡时 WPF 焦点在选项卡控件内容中
【发布时间】:2010-04-08 19:54:02
【问题描述】:

我围绕这个问题在 SO 和 google 上进行了大量搜索,但似乎找不到其他可以尝试的方法。

我有一个包含选项卡控件的 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。

有什么想法吗?

更新:

Bender 的建议奏效了。

所以现在在这两种情况下,焦点元素都是 AutoCompleteBox。然后我要做的是 MoveNext(),它将焦点设置到一个 TextBox。我一直假设此文本框在 AutoCompleteBox 内部,因为发生这种情况时焦点已正确设置在屏幕上。现在我不太确定。这仍然是我在不执行创建时遇到此代码时看到的行为。创建后,MoveNext() 将焦点设置回 MainView 中的一个元素。

问题必须仍然与 Bender 的回答类似,其中控件的状态不一样,具体取决于是否创建了新选项卡。还有其他想法吗?

最终更新

如前所述,majocha 的建议奏效了。

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

【问题讨论】:

    标签: wpf wpf-controls focus


    【解决方案1】:

    您可以尝试延迟焦点更改

    Dispatcher.BeginInvoke(MyChangeFocusAction, DispatcherPriority.ContextIdle);
    

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

    【讨论】:

      【解决方案2】:

      控件必须可见才能获得焦点,您可以尝试通过订阅 IsVisibleChanged 事件来延迟焦点,类似于以下内容应该可以:

      public static void setFocusLate(this Control control)
              {
                  DependencyPropertyChangedEventHandler handler = null;
      
                  handler = delegate
                      {
                          control.Focus();
                          control.IsVisibleChanged -= handler;
                      };
      
                  control.IsVisibleChanged += handler;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 2011-04-27
        • 2011-01-18
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多