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

如何使用MEF从另一个程序集加载WPF treeview资源?,wpf,xaml,caliburn.micro,resourcedictionary,Wpf,Xaml,Caliburn.micro,Resourcedictionary,我正在创建一个WPF应用程序,它使用MEF加载插件。 如何包含使用MEF加载的另一个程序集的资源? 具体来说,我希望在外部程序集中创建一个HierarchycalDataTemplate,并在启动时编写应用程序时将其动态加载到Treeview.Resources。 这样的事情可能吗 我使用的是Caliburn.Micro(如果有必要的话),但我确信这个问题适用于一般的WPF应用程序。如果您尝试加载静态资源,则应该在加载主窗口之前加载资源。 如果尝试加载动态资源,则应在加载使用该资源的视图之前加载

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


我使用的是Caliburn.Micro(如果有必要的话),但我确信这个问题适用于一般的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加载程序集,Caliburn.Micro无法正常工作,所以我必须手动执行。下面是代码的简化部分,用于执行此操作并加载单独的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
    }

谢谢你,伊莱。但是,如何在主视图中告诉我的TreeView使用我加载的HierarchycalDataTemplate?在加载的程序集中,使用HierarchycalDataTemplate定义一个资源字典。模板不应具有仅限键的数据类型。在加载应用程序时,它将在本地搜索模板,最后在应用程序资源中搜索。再次感谢。你给了我正确的方向。