Composite WPF (Prism) module resource data templates

后端 未结 3 505
余生分开走
余生分开走 2020-12-08 03:11

Given that I have a shell application and a couple of separate module projects using Microsoft CompoisteWPF (Prism v2)...

On receiving a command, a module creates a

相关标签:
3条回答
  • 2020-12-08 03:44

    To avoid your shell app from having to know anything about your modules and your modules from reaching out into the shell in any way, I'd provide an interface to your modules like this:

    IMergeDictionaryRegistry
    {
         void AddDictionaryResource(Uri packUri);
    }
    

    You'd ask for this interface in your Module code:

    public class MyModule : IModule
    {
         IMergeDictionaryRegistry _merger;
         public MyModule(IMergeDictionaryRegistry merger)
         {
              _merger = merger;
         }
    
         public void Initialize()
         {
              _merger.AddDictionaryResource(new Uri("pack://application:,,,/Module1;component/Module1Resources.xaml");
         }
    }
    

    You would then implement this in your shell to do this:

    public MergeDictionaryRegistry : IMergeDictionaryRegistry
    {
         public void AddDictionaryResource(Uri packUri)
         {
              Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
              {
                   Source = packUri;
              });
         }
    }
    

    And then finally, in your Bootstrapper's ConfigureContainer:

    public override void ConfigureContainer()
    {
         base.ConfigureContainer();
         Container.RegisterType<IMergeDictionaryRegistry, MergeDictionaryRegistry>();
    }
    

    This will get you the functionality you want and your Shell and your Module will remain independent of each other. This has the added benefit of being more testable in that you have no need to spin up an Application to test your module code (just mock IMergeDictionaryRegistry and you are done).

    Let us know how this goes for you.

    0 讨论(0)
  • 2020-12-08 03:47

    Within the initialisation of each module, you can add to the application resources:

    Application.Current.Resources.MergedDictionaries
                    .Add(new ResourceDictionary
                    {
                        Source = new Uri(
                            @"pack://application:,,,/MyApplication.Modules.Module1.Module1Init;component/Resources.xaml")
                    });
    

    Or if you follow a convention of each module has a resource dictionary called "Resources.xmal"...

    protected override IModuleCatalog GetModuleCatalog()
    {
        var catalog = new ModuleCatalog();
    
        AddModules(catalog,
                   typeof (Module1),
                   typeof(Module2),
                   typeof(Module3),
                   typeof(Module4));
    
        return catalog;
    }
    
    private static void AddModules(ModuleCatalog moduleCatalog,
        params Type[] types)
    {
        types.ToList()
             .ForEach(x =>
                 {
                     moduleCatalog.AddModule(x);
                     Application.Current.Resources.MergedDictionaries
                         .Add(new ResourceDictionary
                                  {
                                      Source = new Uri(string.Format(
                                                           @"pack://application:,,,/{0};component/{1}",
                                                           x.Assembly,
                                                           "Resources.xaml"))
                                  });
                  });
    }
    
    0 讨论(0)
  • 2020-12-08 03:51

    That all seems like a lot of work!

    Personally, I just declare a resource dictionary in my view's UserControl.Resources section like this...

    <UserControl.Resources>
        <ResourceDictionary Source="../Resources/MergedResources.xaml" />
    </UserControl.Resources>
    

    That merged dictionary then points to any resources I need to include.

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Iconography.xaml" />
        <ResourceDictionary Source="Typeography.xaml" />
    </ResourceDictionary.MergedDictionaries>
    

    You'd declare your data templates in there I guess.

    HTH.

    0 讨论(0)
提交回复
热议问题