Как ввести URI для настройки ModuleCatalog в Prism WPF - PullRequest
3 голосов
/ 24 октября 2010

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

Я пытаюсь загрузить свой ModuleCatalog из файла. Я создал файл ModuleCatalog.xaml в моем проекте оболочки. В свойствах файла я удалил действие Custom Tool и установил Build Action на Resource (я также пытался Content ).

Вот код, который у меня есть:

public class Bootstrapper : UnityBootstrapper
{
   protected override IModuleCatalog GetModuleCatalog()
   {
      var uri = new Uri("/ShellProject;component/ModuleCatalog.xaml", UriKind.Relative);
      var catalog = ModuleCatalog.CreateFromXaml(uri);
      return catalog;

      // I have also tried this:
      //return (ModuleCatalog.CreateFromXaml(
      //        new Uri("ModuleCatalog.xaml", UriKind.Relative)));
   }
   ...

При запуске я получаю следующую ошибку:

IModuleCatalog необходим и не может быть нулевым для инициализации модулей.

Я в тупике. Блоги, которые я читал, и видео, которые я смотрел, показывают, что я делаю это правильно.

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

Любая помощь будет отличной!

ПРИМЕЧАНИЯ:

  1. Я использую приложение WPF. Есть множество примеров того, как это сделать в Silverlight. Мне нужно это для WPF.
  2. Я посмотрел этот пост и не нашел его полезным для моей проблемы: http://blogs.southworks.net/dschenkelman/2009/08/09/how-to-populate-the-module-catalog-from-xaml-in-a-wpf-application-using-the-composite-application-guidance-for-wpf-silverlight-prism-v2/

Вот то, что я сделал, наконец-то сработало:

protected override IModuleCatalog GetModuleCatalog()
{
  FileStream catalogStream = new FileStream(@".\ModuleCatalog.xaml",FileMode.Open);
  var catalog = ModuleCatalog.CreateFromXaml(catalogStream);
  catalogStream.Dispose();
  return catalog;
}

Ответы [ 4 ]

2 голосов
/ 28 декабря 2010

Я столкнулся с той же проблемой, но я пытался сделать это с MEF и WPF. Документированные образцы все еще немного слабы в этой области, но мне удалось заставить это работать. Глядя на то, что вы имеете выше, кажется, что вы переопределяете неправильный метод для того, что вы хотите сделать. Вы просто хотите создать каталог модулей, а не настраивать его. Я бы порекомендовал следующий код в Boostrapper для пользователей MEF или Unity, пытающихся сделать это в WPF:

protected override IModuleCatalog CreateModuleCatalog()
{
    // MEF and Unity **BOTH** use the ModuleCatalog when configuring from a file
    return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(
        System.IO.File.OpenRead("catalog.xaml"));
}

Предполагая, что у вас есть "WpfModule1.dll", который использует пространство имен "WpfModule" 1 и имеет класс с именем "WpfModule", который наследует от "IModule", вам понадобится следующий файл конфигурации "catalog.xaml":

<Modularity:ModuleCatalog  
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  xmlns:sys="clr-namespace:System;assembly=mscorlib"  
  xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">
    <Modularity:ModuleInfo Ref="file:///WpfModule1.dll" 
        ModuleName="WpfModule"
        ModuleType="WpfModule1.WpfModule, WpfModule1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
        InitializationMode="WhenAvailable" />
</Modularity:ModuleCatalog>

Обратите внимание, что вы также должны изменить свойства в файле конфигурации на Build Action: "None" и Copy To Output Directory: "Copy if Newer". Надеюсь, это поможет.

1 голос
/ 05 мая 2015

В нашем случае мы получили ту же ошибку:

IModuleCatalog необходим и не может быть нулевым для того, чтобы инициализировать модули.

после обновления с Prism 4.x до 5.0. Оказалось, что это связано с реорганизацией сборки - сборка Microsoft.Practices.Prism , на которую есть ссылка в ModuleCatalog.xaml , больше не существует ; сейчас Microsoft.Practices.Prism.Composition . Легко пропустить волнистую линию в IDE.

Итак, для Prism 5.0 корневой элемент в ModuleCatalog.xaml должен выглядеть следующим образом:

<Modularity:ModuleCatalog  
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  xmlns:sys="clr-namespace:System;assembly=mscorlib"  
  xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism.Composition">
1 голос
/ 30 января 2013

Prism действительно требователен к этому, и вы должны быть очень точны при использовании ModuleCatalog.CreateFromXaml ()

  • Скомпилируйте ModuleCatalog.xaml с действием по созданию страницы
  • Включите номер версии (обычно 1.0.0.0, если вы ничего не меняли) в декларации.например: ModuleType = "MyProj.ModuleB.ModuleBModule, MyProj.ModuleB, версия = 1.0.0.0"
1 голос
/ 24 октября 2010

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

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

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

...