2010-10-24 4 views
3

Je suis un peu frustré par le prisme. Quelque chose qui devrait être si facile est vraiment de me coincer! Je tente de charger mon ModuleCatalog à partir d'un fichier. J'ai créé le fichier ModuleCatalog.xaml dans mon projet shell. Dans les propriétés du fichier que j'ai supprimé l'action outil personnalisé et j'ai mis Build Action-ressources (j'ai aussi essayé contenu).Comment entrer l'URI pour configurer le ModuleCatalog dans Prism WPF

Voici le code que j'ai:

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

Quand je cours, je reçois l'erreur suivante:

The IModuleCatalog is required and cannot be null in order to initialize the modules.

Je suis perplexe. Les blogs que j'ai lus et les vidéos que j'ai regardées semblent indiquer que je le fais bien.

Je ne peux pas penser que je suis le seul à avoir chargé ma configuration à partir d'un fichier xaml dans wpf, mais je ne peux pas trouver de toute façon autour de ça.

Toute aide serait géniale!

NOTES:

  1. J'utilise une application WPF. Il y a des tonnes d'exemples sur la façon de le faire dans Silverlight. J'en ai besoin pour WPF.
  2. J'ai regardé ce poste et n'ont pas trouvé utile pour ma question: 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/

C'est ce que je l'ai fait finalement travaillé:

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

Répondre

1

Pour savoir ce qui est vous pouvez construire les projets Prism et utiliser les fichiers .pdb pour les déboguer ou vous pouvez simplement inclure ces projets dans votre solution et les déboguer directement à partir de là.

S'il s'agit d'une solution de grande taille, essayez ceci en utilisant un Quickstarts de base, puis mettez à jour votre solution en fonction de vos découvertes en déboguant le QS. L'un des grands avantages de Prism libérant sa source est que, dans ce genre de situations, vous pouvez simplement l'explorer étape par étape pour vérifier où se situe le problème.

2

J'ai rencontré le même problème, mais j'essayais de le faire avec MEF et WPF. Les échantillons documentés sont encore un peu faibles dans ce domaine, mais j'ai réussi à le faire fonctionner. En regardant ce que vous avez ci-dessus, il semble que vous remplaciez la mauvaise méthode pour ce que vous voulez faire. Vous voulez juste créer le catalogue de modules, ne pas le configurer. Je recommande le code suivant dans le boostrapper pour les utilisateurs ou Unity MEF essayant de le faire dans 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")); 
} 

En supposant que vous avez un « WpfModule1.dll » qui utilise l'espace de noms « WpfModule » 1 et a une classe nommée "WpfModule" qui hérite de "IModule" vous voulez le "catalogue" suivant.XAML » fichier de configuration:

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

Notez que vous devez également modifier les propriétés du fichier de configuration pour construire Action: « Aucun » et Copie vers le répertoire de sortie: « Copier si plus récent » Espoir qui aide

+0

Je substituez la méthode 'CreateModuleCatalog' correcte mais ayant' Uri ("catalog.xaml", UriKind.Relative) 'ne fonctionne pas pour moi - le fichier n'est pas trouvé, bien qu'il se trouve dans le même dossier. –

+0

Lorsque vous vérifiez les sources Prism, il est évident que 'CreateModuleCatalog (Uri)' suppose que 'Uri' pointe vers la ressource Application. Utilisez donc 'CreateModuleCatalog (Stream)' à la place si vous voulez charger le catalogue du module depuis le fichier local. –

+0

chose drôle, Lukas. Ma réponse précédente a fonctionné pour moi jusqu'à aujourd'hui et j'ai découvert la même chose que vous avez faite. Je ne sais pas pourquoi cela a fonctionné précédemment, mais j'ai modifié ma réponse pour refléter la meilleure pratique. Merci pour vos commentaires. – scottrudy

1
.

Prism est vraiment pointilleux à ce sujet et vous devez être très précis lors de l'utilisation ModuleCatalog.CreateFromXaml()

  • la compilation ModuleCatalog.xaml avec une action de construction de la page
  • Dans clude le numéro de version (généralement 1.0.0.0 si vous n'avez rien changé) dans la déclaration. par exemple: ModuleType = "MyProj.ModuleB.ModuleBModule, MyProj.ModuleB, Version = 1.0.0.0"
1

Dans notre cas, nous obtenions la même erreur:

The IModuleCatalog is required and cannot be null in order to initialize the modules.

après la mise à jour de Prism 4.x à 5.0. Il s'est avéré être à cause de la réorganisation d'ensemble - l'ensemble Microsoft.Practices.Prism référencé dans le ModuleCatalog.xaml n'existe plus; il est maintenant Microsoft.Practices.Prism.Composition. Facile à négliger la ligne ondulée dans l'IDE.

Donc, pour Prism 5.0, l'élément racine ModuleCatalog.xaml devrait ressembler à ceci:

<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"> 
Questions connexes