программно выбрать tabItem в WPF

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

Я перемещаюсь между tabItems программно (как мастер для перехода от первого к следующему)

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

tabItem2.isSelected = true;

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

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

Любая идея?


person Ghassan Karwchan    schedule 01.06.2009    source источник
comment
Просто ради интереса, рассматривали ли вы использование элемента управления Frame и Pages вместо TabControl? Он намного лучше подходит для пользовательского интерфейса в стиле волшебника.   -  person Matt Hamilton    schedule 02.06.2009
comment
ответ, который я дал, был неправильным! :(   -  person Pratik Deoghare    schedule 25.01.2010


Ответы (2)


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

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

person micahtan    schedule 02.06.2009
comment
Или вместо вызова textbox.Focus () вы можете делать то, что WPF делает внутри своего метода TabItem.OnPreviewGotKeyboardFocus. То есть вызовите tabitem.MoveFocus (). - person HappyNomad; 27.08.2010

Эти решения не помогли мне. Он дошел до того, как выбрал нужный элемент 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;
  }
}
person Cod Zombie Guru    schedule 17.08.2013