Как получить доступ к новому визуальному дереву, когда WPF TabControl SelectedItem изменяется - PullRequest
3 голосов
/ 29 октября 2010

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

Вкладка 1: имеет один TextBox

Вкладка 2: имеет два текстовых поля

Вкладка 3: имеет три текстовых поля

Если я перебираю визуальное дерево selectedItem с помощью VisualTreeHelper, я получу два текстовых поля в дочерних элементах TabControl.

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

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

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

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 сентября 2013

Одним из решений является задержка доступа до полной загрузки вкладки с помощью 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 означает, что новая вкладка должна быть загружена до доступа к визуальному дереву.

0 голосов
/ 29 октября 2010

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

...