Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Не отображактся новое окно при RequestNavigation в Prism

Использую в приложении WPF и Prism c UnityContainer. Внутри приложения запускается отдельное окно со следующим содержимым:

То есть окно содержит регион, в котором по нажатию соответствующей RadioButton будет меняться содержимое. Для этого имеются соответствующие подокна и в стартовом модуле происходит их инициализация:
RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeAutoView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSingleView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSelectView));
При открытии окна из программы исполняется следующий код:
var schemeView = unityContainer.Resolve();
regionManager.Regions.Remove("TypeSchemeRegion"); RegionManager.SetRegionManager(schemeView, regionManager);
(SchemeView это самое запускаемое окно) В этом месте все три подокна имеются в списке Views у региона, активным окном (ActiveView) является SchemeAutoView. При старте окна отображается содержимое подокна SchemeAutoView. По нажатию соответствующей RadioButton исполняется код:
_regionManager?.RequestNavigate("TypeSchemeRegion", new Uri("SchemeSingleView", UriKind.Relative));
или:
_regionManager?.RequestNavigate("TypeSchemeRegion", new Uri("SchemeSelectView", UriKind.Relative));
Теперь, если проверить в Debuge содержимое региона, то активное окно соответственно меняется. Однако на экране ничего не происходит, по-прежнему отображается первое активное подокно. Для всех окон используется одна ViewModel. Самое интересное, что в главном окне приложения (Shell) используется эта же методика и все работает на "ура", а в отдельном окне не хочет работать. Что делаю не так?


Ответ

Нашел ошибку сам. Оказывается при работе с Prism, если стартуешь внутри программы новое окно, которое, скажем так, не находиться в контексте главного окна (Shell), необходимо процедуру регистрации окон в регионах повторять почти так же, как в стартовом модуле. Ну или, по крайней мере, у меня так произошло. Итак код при старте нового окна:
regionManager.Regions.Remove("TypeSchemeRegion"); var schemeView= unityContainer.Resolve(); RegionManager.SetRegionManager(schemeView, regionManager); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeAutoView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSingleView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSelectView));
И еще очень важно сначала удалить необходимый регион, затем обязательно сделать Resolve соответствующего окна. В этот момент к окну привязывается ViewModel (если это необходимо) через Dependency Property, затем необходимо произвести переустановку RegionManager и новую привязку окон к региону. Дальше в соответствующих местах RequestNavigate работает без проблем.

Комментариев нет:

Отправить комментарий