如何使用MEF从另一个程序集加载WPF树视图资源?

时间:2015-08-26 15:28:08

标签: wpf xaml caliburn.micro resourcedictionary

我正在创建一个使用MEF加载其插件的WPF应用程序。 如何从我正在使用MEF加载的另一个程序集中包含资源? 具体来说,我想在外部程序集中创建一个HierarchicalDataTemplate,并在启动时编写应用程序时动态加载到Treeview.Resources。 这样的事情可能吗?

如果重要的话,我正在使用Caliburn.Micro,但我确信这个问题适用于一般的WPF应用程序。

2 个答案:

答案 0 :(得分:1)

如果您尝试加载静态资源,则应在加载主窗口之前加载资源。 如果您尝试加载动态资源,则应在加载使用该资源的视图之前加载资源。

任何方式都应该通过在引导时将其添加到Wpf应用程序合并字典来添加对资源的引用。

//On the bootstrapper add the following code
 ResourceDictionary rd = new ResourceDictionary
                                {
                                    Source =
                                        new Uri(
                                            "pack://application:,,,/DllName;component/Themes/ResourceName.xaml",
                                            UriKind.RelativeOrAbsolute)
                                };


Application.Current.Resources.MergedDictionaries.Add(rd);

答案 1 :(得分:1)

这就是我最后的做法 因为如果使用MEF的DirectoryCatalog加载程序集,Caliburn.Micro无法正常工作,我必须手动完成。 Bellow是代码的简化部分,用于加载包含在单独的 resources.xaml 文件中的ResourceDictionary。

FileInfo[] filesInfo = new DirectoryInfo(pluginPath).GetFiles("*.dll");
AssemblySource.Instance.AddRange(filesInfo.Select(fileInfo => Assembly.LoadFrom(fileInfo.FullName)));

// load resources from plugins
var dictionaries = App.Current.Resources.MergedDictionaries;
dictionaries.Clear();

foreach (FileInfo fileInfo in filesInfo)
{
    string assemblyName = Path.GetFileNameWithoutExtension(fileInfo.Name);
    string uriString = assemblyName + @";component/resources.xaml";

    try
    {
        dictionaries.Add(new ResourceDictionary { Source = new Uri(uriString, UriKind.Relative) });
    }
    catch
    {
        // do some logging
    }