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



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

我用的是Caliburn。如果它很重要,但我确信这个问题适用于一般的WPF应用程序。

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

无论如何,你都应该通过在引导时将其添加到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);

最后我是这样做的。
因为这份原稿。如果你使用MEF的DirectoryCatalog来加载你的程序集,Micro就不能正常工作了,我不得不手动完成。下面是代码的简化部分,它执行此操作并加载单独的资源中包含的ResourceDictionary。xaml 文件。

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
    }

相关内容

  • 没有找到相关文章

最新更新