如何使用MEF从另一个程序集加载WPF treeview资源?
我正在创建一个WPF应用程序,它使用MEF加载插件。 如何包含使用MEF加载的另一个程序集的资源? 具体来说,我希望在外部程序集中创建一个HierarchycalDataTemplate,并在启动时编写应用程序时将其动态加载到Treeview.Resources。 这样的事情可能吗如何使用MEF从另一个程序集加载WPF treeview资源?,wpf,xaml,caliburn.micro,resourcedictionary,Wpf,Xaml,Caliburn.micro,Resourcedictionary,我正在创建一个WPF应用程序,它使用MEF加载插件。 如何包含使用MEF加载的另一个程序集的资源? 具体来说,我希望在外部程序集中创建一个HierarchycalDataTemplate,并在启动时编写应用程序时将其动态加载到Treeview.Resources。 这样的事情可能吗 我使用的是Caliburn.Micro(如果有必要的话),但我确信这个问题适用于一般的WPF应用程序。如果您尝试加载静态资源,则应该在加载主窗口之前加载资源。 如果尝试加载动态资源,则应在加载使用该资源的视图之前加载
我使用的是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定义一个资源字典。模板不应具有仅限键的数据类型。在加载应用程序时,它将在本地搜索模板,最后在应用程序资源中搜索。再次感谢。你给了我正确的方向。