我正在创建一个使用MEF加载其插件的WPF应用程序。 如何从我正在使用MEF加载的另一个程序集中包含资源? 具体来说,我想在外部程序集中创建一个HierarchicalDataTemplate,并在启动时编写应用程序时动态加载到Treeview.Resources。 这样的事情可能吗?
如果重要的话,我正在使用Caliburn.Micro,但我确信这个问题适用于一般的WPF应用程序。
答案 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
}