RegionManager Prism отображает производительность переключения
Я выполняю профилирование производительности приложения WPF, написанного с использованием библиотеки PRISM. В этом приложении переход от одного вида к другому особенно медленный, особенно при переходе от "тяжелого" вида. Обратите внимание, что:
- представления перемещаются в кеш и не восстанавливаются при навигации назад и вперед
(следствие PRISM, сохраняющего все представления в SingleActiveRegion) - Я понимаю, что создание представления может быть медленным в первый раз из-за синтаксического разбора xaml, JIT'ing, .. НО этот вопрос о том, что навигация остается медленной, даже ПОСЛЕ открытия представления в первый раз
Используя библиотеку PRISM, регионы обычно реализуются в ContentControl, например:
<ContentControl regions:RegionManager.RegionName="MAIN" />
Как следствие, переключение представления в области MAIN обновит "Content" этого ContentControl (как видно из исходного кода). Установка и переключение элементов пользовательского интерфейса в качестве "контента" ContentControl имеет побочные эффекты производительности (см. Этот блог).
Чтобы преодолеть это поведение, я реализовал пользовательский RegionAdapterBase ( CachingGridRegionAdapter.cs) для Grid, который в основном добавляет все представления, по которым осуществляется навигация как дочерние, и скрывает все неактивные представления.
Прирост производительности огромен; переход от одного вида к другому теперь мгновенный. Вопрос: есть ли недостатки этого подхода?
- Что касается памяти, я не вижу проблемы, так как PRISM все равно хранит в памяти все представления
- есть ли недостаток в том, чтобы иметь большое визуальное дерево со многими частями, имеющими Visibility = Collapsed?
Если есть другие способы преодоления этой проблемы, пожалуйста, дайте мне знать.
Спасибо за ваше время,
Koen