выберите вкладку Элемент программно в WPF - PullRequest
7 голосов
/ 02 июня 2009

У меня есть разные tabItems в TabControl и у каждого tabItem есть несколько полей ввода.

Я перемещаюсь между tabItems программно (как мастер, чтобы перейти от первого к следующему)

Я использую этот код внутри кнопки «Далее»

tabItem2.isSelected = true;

моя проблема в том, что когда я перемещаюсь между tabItems, нажимая на них, фокус (фокус клавиатуры) перемещается к первому вводу текстового поля.

Но программно с предыдущим кодом фокус не будет перемещаться к первому элементу ввода текста внутри tabItem.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 02 июня 2009

Если вы заставляете свойство IsSelected, я бы также дал имя первому TextBox и установил фокус после того, как вы установили выбранную вкладку.

Если вы динамически строите свой пользовательский интерфейс, это не будет работать, но вы можете создать служебный метод, который ищет логическое дерево (или визуальное дерево, если вы используете презентаторы / модели представления) для первого ввода контролировать, а затем установить фокус.

0 голосов
/ 17 августа 2013

Эти решения не сработали для меня. Он дошел до того, что выбрал нужный мне TabItem, но не смог выделить / сфокусировать нужный TreeViewItem. (Он будет фокусировать TVI, только если TabItem уже выбран.) Решение, приведенное ниже, наконец-то сработало для меня.

(К вашему сведению: приведенные ниже фрагменты являются частью приложения, аналогичного Microsoft Help Viewer 2.0. Когда вы нажимаете кнопку «Синхронизировать», сначала выбирается вкладка «Содержимое», если она еще не выбрана, а затем перемещается в древовидное представление, пока не найдет соответствующий элемент вида дерева. Который затем выбирает / фокусирует.)

Приветствия

private void OnClick_SyncContents(object sender, RoutedEventArgs e)
{
    // If the help-contents control isn't visible (ie., some other tab is currently selected),
    // then use our common extension method to make it visible within the tab control.  Once
    // it visible, the extension method will call the event handler passed (which is this method)
    if (!this.m_UcHelpFileContents.IsVisible)
    {
      this.m_UcHelpFileContents.
      SelectParentTabItem_WaitForMeToBecomeVisible_ThenCallThisEventHandlerWithNullArguments
      (this.OnClick_SyncContents);
    }
    else 
    {
      // Else the help-contents control is currently visible, thus focus the 
      // matching tree view item
      /* Your code here that focuses the desired tree view item */
    }
}


public static class CommonExtensionMethods
{
  public static void
    SelectParentTabItem_WaitForMeToBecomeVisible_ThenCallThisEventHandlerWithNullArguments
    (this FrameworkElement frameworkElement, RoutedEventHandler eventHandlerToCallWhenVisible)
  {
    // First, define the handler code for when the given framework element becomes visible
    DependencyPropertyChangedEventHandler HANDLER = null;
    HANDLER = (s, e) =>
    {
      // If here, the given framework element is now visible and its tab item currently selected
      // Critical: first and foremost, undo the latch to is-visible changed
      frameworkElement.IsVisibleChanged -= HANDLER;

      // Now invoke the event handler that the caller wanted to invoke once visible
      frameworkElement.Dispatcher.BeginInvoke(eventHandlerToCallWhenVisible, null, null);
    };

    // Use our common extension method to find the framework element's parent tab item
    TabItem parentTabItem = frameworkElement.GetFirstParentOfType<TabItem>();

    if (parentTabItem != null)
    {
      // Assign the handler to the given framework element's is-visible-changed event
      frameworkElement.IsVisibleChanged += HANDLER;

      // Now set the tab item's is-selected property to true (which invokes the above 
      // handler once visible)
      parentTabItem.IsSelected = true;
    }
  }


  public static T GetFirstParentOfType<T>
    (this FrameworkElement frameworkElement) where T : FrameworkElement
  {
    for (FrameworkElement fe = frameworkElement.Parent as FrameworkElement; 
         fe != null; 
         fe = fe.Parent as FrameworkElement)
    {
      if (fe is T)
        return fe as T;
    }

    // If here, no match
    return null;
  }
}
...