2010-10-29 7 views
3

Учитывая уже загружены и вынесенное TabControl с тремя вкладками, с выбранной вкладкой будучи индексом 1 (средний):Как открыть новое визуальное дерево, когда WPF TabControl SelectedItem изменения

Tab 1: Имеет один TextBox

Tab 2: Имеет два TextBoxes

Tab 3: Имеет три Textboxes

Если я перебирать визуальное дерево SelectedItem с VisualTreeHelper, я получить два Textboxes в пределах детей в TabControl в.

Я хочу повторить повтор, когда выбор вкладки изменится и доступ к элементам управления новой вкладки. Если я переключусь на индекс вкладки 2, я должен найти три текстовых поля, используя VisualTreeHelper.

Обычным решением было бы подписаться на событие с измененным выбором и пройти через дерево, чтобы извлечь вновь показанные элементы управления. Проблема в том, что на данный момент времени визуальное дерево все еще имеет старую вкладку, что делает этот поиск бесполезным.

Как я могу перехватить момент, когда отображается новый элемент TabItem, и запустить поиск?

Я создаю динамический механизм проверки, который контролирует все элементы управления вводами данного интерфейса, даже если он изменяется либо с помощью изменений шаблона ContentControl, либо с помощью вкладки TabControl, измененной ... Я надеюсь, что вы получите изображение.

Любые идеи?

+0

У вас есть возможность найти решение? Я столкнулся с одной и той же проблемой - мне нужно итерировать элементы управления новой вкладкой, но VisualTreeHelper показывает старые элементы Tab в обработчике событий SelectionChanged. – digitguy

ответ

0

TabControl загружает/выгружает свои элементы при переключении вкладок, поэтому вы можете прикрепить свою проверку на событие Loaded TabItem.

+0

Вы уверены, что TabControl загружает/выгружает свои элементы, поэтому будет выгружено событие Unloaded старого события TabItem и Loaded нового TabItem? Я попробовал это, но событие Loaded/Unloaded никогда не возникало при изменении вкладок. – digitguy

+0

@digitguy У всех ваших 'TabItems' есть тот же' ItemTemplate'? Если это так, он будет повторно использовать существующий шаблон вместо выгрузки и перезагрузки нового – Rachel

+0

Нет, я не использую какой-либо ItemTemplate. У меня есть простой TabControl с двумя TabItems, каждый из которых имеет свой собственный StackPanel с двумя текстовыми блоками. – digitguy

1

Одним из решений является задержка доступа, пока язычок полностью загружен с помощью Dispatcher.BeginInvoke:

private void TabControlSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, 
           (Action)(() => 
           { 
            // access the new tab's visual tree here 
           })); 
} 

Использование DispatcherPriority.Loaded означает, что новая вкладка будет необходимо загрузить до Визуальное дерево доступ.

 Смежные вопросы

  • Нет связанных вопросов^_^