nmeri17 Ответов: 2

Как получить доступ к регионам в оболочке приложения?


Я пытаюсь ввести взгляд в свою оболочку. Состояние документов
Цитата:
Класс RegionManager обеспечивает доступ к объектам региона в приложении.
но когда я инициализирую класс RegionManager и попытаюсь вызвать его Regions["MAIN_REGION"] в этом случае он говорит, что такой регион не был найден в менеджере.

Что я уже пробовал:

Я также попытался использовать новый экземпляр Region в целом (поскольку документы не дают никакого способа получить доступ ни к глобальному RegionManager, ни к тому, кто знает регионы в оболочке).

Region v = new Region(); // also tried ServiceLocator.Current.GetInstance<RegionManager>();

v.RequestNavigate("MAIN_REGION", new Uri("Login", UriKind.Relative)); // Login is a valid code-behind while main_region is a prism region in my shell


Вышеизложенное не отображает регион, предположительно потому, что оно может найти вид, но не регион. Должен Ли Я RegisterViewWithRegion когда я не собираюсь все время загружать только этот вид в свой main_region?

2 Ответов

Рейтинг:
2

Dirk Bahle

Я сам не работаю с регионами но знаете ли вы что вы можете найти образцы призмы
проект по:
GitHub - PrismLibrary/Prism-Samples-Wpf: примеры, демонстрирующие использование различных функций Prism в WPF[^]

Этот проект содержит по крайней мере 2 региональных образца (см. ниже) - помогает ли это ответить на вашу проблему?

Призма-образцы-приложение WPF/02-регионах мастер · PrismLibrary/призм-образцов-в WPF · на GitHub[^]

Призма-образцы-приложение WPF/03-CustomRegions мастер · PrismLibrary/призм-образцов-в WPF · на GitHub[^]


nmeri17

Да, я действительно знал о них, спасибо. Я исправил его и ввел представление, но вместо того, чтобы отображать представление (которое является UserControl) в этой области, он преобразует его в строку и показывает систему.Объект.

nmeri17

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

Dirk Bahle

Вам не нужно делать разметку по регионам только потому, что вы используете PRISM. Обычная компоновка через XAML все еще доступна - в моем случае я использую AvalonDock для компоновки документов и окон инструментов, которая хорошо работает, если вы заинтересованы в приложении, ориентированном на документ. Вы можете просмотреть этот проект, чтобы понять, как он работает:
https://github.com/Dirkster99/Edi

(или следуйте моему учебнику по AvalonDock, если вас это интересует)

nmeri17

Очень хорошо. Позвольте мне взглянуть, спасибо.

nmeri17

Привет, в конце концов я дозвонился, посмотрев на следующее https://www.codeproject.com/Articles/165370/Creating-View-Switching-Applications-with-Prism и зовет


IUnityContainer con = ServiceLocator.Current.GetInstance<IUnityContainer>();
con.RegisterType<Object, Login>("Login");

перед вызовом навигации. Это работало над созданием нового контейнера, такого как
IUnityContainer con = new UnityContainer();
con.RegisterType(typeof(Login), "Login");


Тем не менее, я все равно взгляну на Авалондок просто ради удовольствия, еще раз спасибо.

Рейтинг:
2

nmeri17

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

public partial class Shell : Window
    {

        public IRegionManager x;

        public Shell(IRegionManager regionManager)
        {
            InitializeComponent();

            x = regionManager;
        }
    }


Затем в загрузчике или где бы то ни было, откуда будет вызван модуль, возьмите это поле-член и передайте его конструктору целевого модуля (который будет вызван перед его методом инициализации).
protected override void InitializeShell()
        {
            Application.Current.MainWindow = (Shell) Shell;

            Application.Current.MainWindow.Show();

            IRegionManager u = ServiceLocator.Current.GetInstance<Shell>().x;

            IModule firstScreen = new LoginModule.LoginModule(u);


Наконец, в конструкторе целевого модуля вы можете использовать его по своему желанию.

    public void Initialize () {

        IUnityContainer con = ServiceLocator.Current.GetInstance<IUnityContainer>();

        con.RegisterType<Object, Login>("Login");

        Region mainRegion = (Region) _regionMan.Regions["MainRegion"]; // use here

        mainRegion.RequestNavigate(new Uri("Login", UriKind.Relative));
    }
}


Надеюсь, это поможет кому-то еще с той же проблемой.