Область PRISM исчезает при создании всплывающего окна

У меня есть всплывающее окно с регионом, который содержит другой регион. Это всплывающее окно вызывается с помощью методологии WPF Prism(MEF) InteractionRequest. Структура выглядит так:

PopUpUserControl
  - ContentControl : Region(UserCatalogsCreateRegion)
     - PopUpStageUserControl
       - StackPanel 
          -ContentControl : Region(UserCatalogsCreateStackRegion) <--Disappearing Region

Проблема проявляется так. Когда приложение запускается и работает нормально, я могу перечислить регионы в приложении и вижу, что RegionManager содержит регион с именем «UserCatalogsCreateStackRegion».

Теперь, когда я нажимаю кнопку, которая запускает InteractionRequest для PopUpCreation, я вижу, что список регионов больше не содержит «UserCatalogsCreateStackRegion». Я убедился, что что-то удаляет мой регион, потому что я добавил CollectionListener в свойство Regions диспетчера регионов, и как только создается всплывающее окно, моя точка останова срабатывает, а Notif..Action — «Удалить», а OldItem — это регион. обсуждаемый.

Регион TL; DR исчезает из RegionManager.Regions, когда создается и вызывается всплывающее окно, содержащее указанный регион.

Любая помощь приветствуется. И я постараюсь ответить на как можно больше других вопросов, так как МНОГО всего может пойти не так с региональным менеджером.

ИЗМЕНИТЬ

Ссылки Брайана Лагунаса указывали прямо на избитое решение. Это было решением. Мой окончательный рабочий код для PopUpStageControl выглядит так, где ContentControl — это регион, который продолжал «исчезать»:

    [ImportingConstructor]
    public PopUpStageUserControl(IRegionManager regionManager)
    {
        InitializeComponent();
        this.regionManager = regionManager;

        //Fix Begin
        RegionManager.SetRegionName(ContentControl, AppRegions.UserCatalogsCreateStackRegion);
        RegionManager.SetRegionManager(ContentControl, regionManager);
        //Fix End

        RegionManager.SetRegionManager(this, regionManager);
        RegionManager.UpdateRegions();
    }

person Black Dynamite    schedule 11.12.2015    source источник
comment
Просто предположение, но когда регион используется, он, вероятно, удаляется из RegionManager, чтобы он не использовался/не отображался в другом элементе управления. Когда всплывающее окно, содержащее регион, закрывается/собирается сборщиком мусора, я полагаю, что оно снова добавляется в RegionManager. Отказ от ответственности: я никогда не использовал PRISM.   -  person Kcvin    schedule 11.12.2015


Ответы (3)


Это связано с тем, что всплывающее окно не является частью визуального дерева, поэтому менеджер региона не сможет найти регион. Регион придется прописывать вручную. Смотрите эти сообщения:

Регион, не загруженный RegionManger

Как зарегистрировать регионы внутри пользовательских элементов управления или шаблоны управления в RegionManager?

Области PRISM 6 в WPF с использованием DataTemplate/CustomControl

https://github.com/PrismLibrary/Prism/issues/251

person Community    schedule 12.12.2015

Я заканчиваю свой комментарий, а затем быстрый Google результат (старая версия PRISM).

Интерфейс IRegionMemberLifetime. Также обратите внимание, что класс ModuleARibbonTab реализует интерфейс IRegionMemberLifetime. Этот интерфейс предоставляется Prism, и он определяет, удаляется ли представление из области, когда пользователь уходит из представления.

Судя по всему, вы можете захотеть реализовать IRegionMemberLifetime и установить KeepAlive соответствующим образом - это может повлиять на то, когда RegionManager удаляет/сохраняет регион.

person Kcvin    schedule 11.12.2015
comment
Интерфейс IRegionMemberLifetime не управляет временем жизни самого региона, а только представлениями внутри региона. - person ; 12.12.2015
comment
@NETScape не повезло. Я убрал свой код, ну, по крайней мере, те части, которые касаются этого, и ему все равно. Я вижу свой регион во время инициализации модуля, а потом он почему-то удаляется. - person Black Dynamite; 12.12.2015

Хотя вы не указали это в своем опубликованном коде, я предполагаю, что вы используете что-то подобное при настройке InteractionRequest:

<prism:PopupWindowAction.WindowContent>
    <inf:PopUpStageUserControl/>
</prism:PopupWindowAction.WindowContent>

Поэтому вы должны знать, что во время выполнения Prism заменит все всплывающее содержимое тем, которое вы указали в PopupWindowAction.WindowContent.

person E-Bat    schedule 11.12.2015