Интеграция модулей с приложением в Prism, также известном как CompositeWpf

StackOverflow https://stackoverflow.com/questions/1671526

  •  13-09-2019
  •  | 
  •  

Вопрос

От MSDN:

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

У меня аналогичный сценарий: я добавляю представления в регионы в методе инициализации модуля, используя RegisterViewWithRegion.Мне бы хотелось отобразить взаимодействие пользователя на основе представления с помощью меню (это другой модуль).

Как мне добиться такого поведения, не нарушая развязанное поведение модулей в Prism?

Можно ли активировать/показать представление, добавленное в регион, скажем, модулем A из модуля B?

Это было полезно?

Решение

Что я делаю, так это создаю реестр представлений в своей оболочке со следующим интерфейсом (здесь я упрощаю):

public interface IViewRegistry
{
     void RegisterView(string title, string key, Func<UIElement> viewCreationMethod);
     void OpenView(string key);
}

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

public static class ViewStore
{
     public Dictionary<string, ViewEntry> Views { get; set; }
     static ViewStore()
     {
          Views = new Dictionary<string, ViewEntry>();
     }

     public void RegisterView(string name, string key, Func<UIElement> createMethod)
     {
         Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod });
     }
}

Затем из моей реализации IViewRegistry:

public class ViewRegistryService : IViewRegistry
{
     public void RegisterView(string title, string key, Func<UIElement> createMethod)
     {
          ViewStore.RegisterView(title, key, createMethod);
     }

     public void OpenView(string key)
     {
          //Check here with your region manager to see if
          //the view is already open, if not, inject it
          var view = _regionManager.Regions["MyRegion"].GetView(key);
          if(view != null)
          {
               view = ViewStore.Views[key]();
               _regionManager.Regions["MyRegion"].Add(view, key);
          }
          _regionManager.Regions["MyRegion"].Activate(view);
     }

     private IRegionManager _regionManager;
     public ViewRegistryService(IRegionManager rm)
     {
          _regionManager = rm;
     }
}

Теперь у меня есть две вещи:

  1. ViewStore, который я могу использовать для создания меню в своей оболочке.
  2. Способ открытия модулей, принадлежащих другим модулям, без связи с простыми ModuleDependency (на самом деле даже ModuleDependency не требуется, но, вероятно, это правильно).

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

Кроме того, вы должны дать Stackoverflow немного шанса получить ответ...ты дал нам всего 3 часа, прежде чем сдался :)

Надеюсь это поможет.

Другие советы

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

В настоящее время я добавляю ссылки на другие модули для View Injection и теряю слабосвязанную природу Prism.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top