Принудительное создание визуального дерева с помощью Prism

У меня есть TabControl содержащие призмы областей. Я хочу вызвать какое-то уведомление (например, мигать заголовок вкладки) для определенных событий, и я хочу вызвать это уведомление от компонентов в регионах Prism.

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

Но проблема в том, что это не работает, пока вкладка не будет открыта пользователем, потому что VisualTreeUtil.GetParent() возвращает ноль; очевидно, потому что Prism не подключает визуальное дерево до тех пор.

призвание UpdateLayout() на TabItem Содержать регион не помогает. Я не хочу открывать TabItems программно, потому что это может запутать пользователя.

Могу ли я что-то сделать, кроме как создать регистр региона (который будет довольно уродливым и сложным в обслуживании)?

Если вы хотите посмотреть на код, я написал минимальное решение, чтобы продемонстрировать проблему. Кнопка " Структура печати" пытается перейти вверх по визуальному дереву из (изначально не визуализированного невидимого) привет TextBlock на второй вкладке. Прежде чем переключиться на вкладку, он печатает только TextBlock, после чего вы попадаете в корень визуального дерева. Это то, что я хочу сделать, не переходя на вкладку.

2 ответа

Добавление комментария в качестве ответа:

Вероятно, это не совсем тот ответ, который вы ищете, но кажется, что вы используете очень процедурный подход.

Рассматривали ли вы использование подхода MVVM? каждый TabItem в TabControl может иметь HeaderTemplate, В шаблоне вы можете привязать свойство в ViewModel, которое заставляет вкладку мигать или менять внешний вид

Хм.. Регионы IIRC Prism - это просто настроенный ContentControl/ContentPresenter. Как только они будут готовы к работе, все привязки и модели данных должны быть на месте, но деревья не будут созданы, потому что они невидимы. Если это так, вы должны быть в состоянии вызвать ApplyTemplate() для них, чтобы заставить его. Я не помню, однако, если Prism назначает contenttemplates/datacontexts при init или по требованию - последний может вызвать бесполезный вызов ApplyTemplate.

Другие вопросы по тегам