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);