Использование Prism для навигации в приложении Wpf

Я начинаю новый проект в Wpf и сейчас изучаю возможность использования Prism. А пока просто пытаюсь настроить навигацию приложения с помощью Prism. К сожалению, мой недостаток опыта работы с фреймворком затрудняет начало работы.

Чтобы быть более точным в отношении моей первой задачи, у меня есть приложение с областью «навигация / меню» и «основной» областью. Область навигации будет одинаковой для всех различных представлений основной области, поэтому я определяю меню в shell.xaml. При щелчке по любому пункту меню я хотел бы добавить вид на регион с помощью Prism. Первый; это то, для чего обычно используют Prism? Если так; какой типичный подход? И я имею в виду на более структурном уровне ..

У меня сложилось впечатление, что Prism в конечном итоге сделает мое приложение более масштабируемым, и я вижу, что получаю от него некоторые другие преимущества - например, контейнер IoC. Так что я бы хотел его использовать - если бы я смог сделать только первые шаги ..


person stiank81    schedule 09.09.2009    source источник


Ответы (2)


У меня есть образец, который использует немного больше ощущения CAG для модулей, участвующих в меню, и того, как добавлять представления в регион. Это должно прояснить ситуацию.

http://dl.getdropbox.com/u/376992/CAGMenus.zip

Надеюсь, это поможет, Андерсон

person Anderson Imes    schedule 10.09.2009
comment
Спасибо. Этот образец у меня уже есть. У меня есть концепции, но я не мог полностью взять их в руки и собрать все вместе в своих собственных приложениях. Но после некоторого дальнейшего исследования этот образец все-таки мне действительно помог - так что теперь я на правильном пути. - person stiank81; 10.09.2009
comment
Отмечая это как ответ, поскольку предоставленный образец кода привел к решению. Спасибо! - person stiank81; 10.09.2009

Бумбуська,

Prism - отличный способ реализовать эту функциональность, и это довольно легко сделать, если вы поймете принципы.

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

Ваш основной регион должен выглядеть примерно так:

public void Initialize()
{
    Events.PageEvents.ClickedEvent1 ce1 = this.eventAggregator.GetEvent<Events.PageEvents.ClickedEvent1>();
    ce1.Subscribe(LoadView, ThreadOption.UIThread, true);
}

private void LoadView(Events.HomePageEvents.Clicked clicked1)
{
    IRegion mainRegion = RegionManager.Regions["MainRegion"];
    foreach (object view in new List<object>mainRegion.Views))
    {
        RegionManager.Regions["MainRegion"].Remove(view);
    }

    IModule firstModule = Container.Resolve<Modules.FirstModule>();
    firstModuleModules.Initialize();

}

Надеюсь, это укажет вам правильное направление. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

person Cornelius Kruger    schedule 09.09.2009
comment
Спасибо! Для меня это хорошая помощь. Теперь он работает так, как я хотел, но я не использую агрегацию событий. Я использую привязки команд к пунктам меню, которые представляют собой некоторые объекты viewModel, содержащие информацию о том, какой компонент открыть в основной области. Мне это кажется нормальным, но является ли агрегация событий более предпочтительным способом? Спасибо за пример очистки региона. Я надеялся найти функцию для установки элемента в представлении вместо того, чтобы очищать все существующие и добавлять новый. Но ваш пример иллюстрирует типичный подход? - person stiank81; 10.09.2009
comment
Это действительно зависит от вашего приложения, какая команда или события лучше. Я думаю, что для основных команд меню навигации, вероятно, подойдут лучше. Вы можете активировать все свои представления в основном регионе и просто активировать тот, который хотите использовать. Опять же, это будет зависеть от вашего приложения, но я бы не стал загружать то, что может не использоваться. - person Cornelius Kruger; 10.09.2009
comment
Ладно - мне кажется разумным пока без событий. Возможно, позже я изменю свое мнение, но пока это работает. Еще раз спасибо за вашу помощь! - person stiank81; 10.09.2009