WPF, Prism v2, Region в модальном диалоге, добавьте регион в коде - PullRequest
11 голосов
/ 19 июня 2009

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

У меня сложилось впечатление, что менеджер региона был глобальным, и просто добавив cal: RegionManager.RegionName = "WizardSteps", можно было бы сделать это, но, очевидно, нет.

Если я передам диспетчер регионов представлению, я смогу использовать его ... Кто-нибудь знает, как добавить регион в ContentControl в коде позади?

Ответы [ 3 ]

17 голосов
/ 19 июня 2009

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

В Bootstrapper после создания оболочки выполняется следующий код.

RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());
RegionManager.UpdateRegions();

Чтобы заставить менеджера региона работать с вашим дочерним окном, сделайте то же самое сразу после того, как вы создали окно.

EDIT

Чтобы установить имя региона для элемента управления, вы также устанавливаете вложенное свойство RegionManager, например, так ...

RegionManager.SetRegionName(control, "MyRegion");

Однако вы можете сделать это и в xaml. Причина, по которой ваши регионы в отдельном окне не работают, заключается в том, что RegionManager должен быть установлен в базовом окне, как я показал выше.

7 голосов
/ 30 марта 2010

Это на самом деле довольно просто.

В вашем всплывающем окне xaml добавьте имя региона, как в оболочке. Затем в конструкторе всплывающих окон добавьте следующий вызов:

public Popup(IRegionManager regionManager)
{
     InitializeComponent();
     RegionManager.SetRegionManager(this,regionManager);
}

Это работает для меня в Prism v.1 - не должно сильно отличаться в более поздних версиях.

0 голосов
/ 22 июня 2009

Я нашел что-то, что почти работает. Я уверен, что если бы я мог связать активное представление региона со свойством contentContol, то это сработало бы, но я пока не справился.

IRegionManager MyRegionManager = container.Resolve<IRegionManager>();
SingleActiveRegion newRegion = new SingleActiveRegion();
MyRegionManager.Regions.Add("WizardSteps", newRegion);

//Binding
Binding myBinding = new Binding("ActiveViews");
myBinding.Source = newRegion;
view.stepControl.SetBinding(ContentControl.ContentProperty, myBinding);
...