2009-06-01 8 views
7

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

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

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

tabItem2.isSelected = TRUE;

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

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

Любая идея?

+0

Просто из интереса, рассматривали ли вы с помощью элемента управления кадров и страницы, а не TabControl? Он намного лучше подходит для пользовательских интерфейсов в стиле мастера. –

+0

Ответ, который я дал, был неправильным! :( –

ответ

3

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

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

+0

Или вместо вызова textbox.Focus() вы можете делать то, что WPF делает внутри внутри своего метода TabItem.OnPreviewGotKeyboardFocus. То есть вызовите tabitem.MoveFocus(). – HappyNomad

0

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

(FYI: нижеприведенные фрагменты являются частью приложения, похожего на 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; 
    } 
}