当前位置:  开发笔记 > 前端 > 正文

复合WPF(Prism)模块资源数据模板

如何解决《复合WPF(Prism)模块资源数据模板》经验,为你挑选了2个好方法。

鉴于我有一个shell应用程序和一些使用Microsoft CompoisteWPF(Prism v2)的独立模块项目......

在接收命令时,模块创建新的ViewModel并通过区域管理器将其添加到区域.

var viewModel = _container.Resolve();
_regionManager.Regions[RegionNames.ShellMainRegion].Add(viewModel);

我想我可以在模块中创建一个资源字典并设置一个数据模板来显示已加载的视图模型类型的视图(参见下面的xaml).但是当视图模型添加到视图中时,我得到的只是打印出的视图模型命名空间.


    
        
    

编辑:

我可以通过添加到App.xaml来实现它


    
        
        
    

这很好,但这意味着在创建新模块时,需要添加App.xaml文件.我正在寻找的是模块的一种方式,因为它们加载动态添加到Application.Resources.这可能吗?



1> Anderson Ime..:

为了避免你的shell应用程序必须知道你的模块和模块的任何信息,以任何方式进入shell,我会为你的模块提供如下界面:

IMergeDictionaryRegistry
{
     void AddDictionaryResource(Uri packUri);
}

您需要在模块代码中使用此接口:

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

然后,您将在shell中实现此操作:

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

最后,在你的Bootstrapper的ConfigureContainer中:

public override void ConfigureContainer()
{
     base.ConfigureContainer();
     Container.RegisterType();
}

这将为您提供所需的功能,您的Shell和您的模块将保持彼此独立.这样做的另一个好处是更易于测试,因为您无需启动Application测试模块代码(只需模拟IMergeDictionaryRegistry即可完成).

让我们知道这对你有何影响.



2> Oll..:

在每个模块的初始化中,您可以添加到应用程序资源:

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

或者如果你按照每个模块的约定有一个名为"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"))
                              });
              });
}

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有