WPF, Prism v2, Region в модальном диалоге, добавьте область в код позади

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

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

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

Ответ 1

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

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

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

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

ИЗМЕНИТЬ

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

RegionManager.SetRegionName(control, "MyRegion");

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

Ответ 2

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

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

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

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

Ответ 3

Я нашел что-то, что почти работает. Я уверен, что если бы я мог привязать активный вид области к контенту 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);