WPF Prism - использовать области действия или нет? - PullRequest
3 голосов
/ 05 октября 2009

У меня есть проект WPF, основанный на выпуске Prism Feb 2009, настроенный как:

Shell представляет один ContentControl как «MainRegion» В другом представлении (пользовательском элементе управления), определенном в проекте инфраструктуры под названием SplitView, две дополнительные области «LeftRegion» и «RightRegion» также представлены как ContentControl.

Некоторые модули моего приложения должны отображать свое представление в MainRegion (один пользовательский элемент управления), в то время как другие должны отображать свои представления (два пользовательских элемента управления в разделенном виде) в LeftRegion и RightRegion.

Я пытался использовать области с областями действия, предполагая, что определенные контроллеры будут содержать ссылки на области с областями действия. Таким образом, в основном каждый контроллер, заинтересованный в функциональности SplitView, должен создавать новый SplitView (пользовательский элемент управления) и активировать его в MainRegion, одновременно активируя два пользовательских элемента управления в LeftRegion и RightRegion недавно созданных scoped SplitView.

Я использую MVVM с View Injection для отображения видов.

Излишне говорить, что с этим подходом что-то пошло не так.

Во время выполнения я получаю это исключение: «Возникла исключительная ситуация при создании региона с именем« LeftRegion ». Исключением было: System.InvalidOperationException: указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его».

Правильно ли я полагаю, что LeftRegion и RightRegion пытаются зарегистрироваться в главном RegionManager каждый раз, когда я создаю экземпляр SplitView?

Извините за запутанный / подробный пост. Какие-либо предложения? Лучшие практики для достижения этой цели?

Заранее спасибо,

Али

1 Ответ

2 голосов
/ 06 октября 2009

Исключение «Указанный элемент уже является логическим потомком ...» - это то, что происходит, когда вы пытаетесь добавить что-то в два места в дереве, поэтому я предполагаю, что в вашем коде может быть какая-то логическая ошибка, или вы добавив что-то дважды.

Обычно я создаю свои субрегионы следующим образом:

    m_scopedRegionName = Guid.NewGuid().ToString(); /* EXAMPLE ! */
    m_scopedRegionManager =  m_regionManager.Regions[RegionNames.WORKSPACE_REGION].Add(myViewModel.View, m_scopedRegionName, true);
    m_someThingRegion = m_scopedRegionManager.Regions[RegionNames.SOME_THING_REGION];

Затем я добавляю все новые вещи в "m_someThingRegion".

...