我有 WPF 应用程序here,它位于 MVVM 模式中,使用 MVVMLight 作为框架和 MEF 具有名为 VCNEditor 的用户控件的插件。
主应用程序使用名为DialogBehavior的DialogViewModel的附加行为来显示Dialogboxes。 DialogBehavior使用以下命令将视图绑定到其预先创建的DialogViewModel : IDialogViewModel
(viewmodel优先):
var resource = Application.Current.TryFindResource(viewModel.GetType());
插件是一个带有UserControl的库。 UserControl是从“扩展”目录动态加载的,只有在可见时才会显示。
到目前为止这是有效的。我目前面临的问题是:我尝试以与在主应用程序中相同的方式在我的插件中显示对话框。
含义:我定义了一个名为“对话框”的属性
ObservableCollection<IDialogViewModel>
在我的UserControlViewModel : IDialogViewModel
和DataBind中,该属性为附加行为。
当我现在将新的DialogViewModel添加到该集合
时 Application.Current.TryFindResource(viewModel.GetType())
无法找到任何资源,因为Application.Current正在返回主应用程序,并且库没有像主应用程序中的app.xaml那样的任何资源字典。
我无法将插件对话框的资源添加到主应用程序中,因为这会破坏我松散耦合的插件架构。
我只是一个休闲开发者,如果有人能指出我正确的方向,那就太好了。 目前的解决方法是,我在每个viewmodels construcor中“手动”创建视图。但我认为这看起来非常好。
感谢您的支持。
答案 0 :(得分:1)
如果我理解正确,您可以轻松地将插件样式和资源添加到代码中的Application.Current.Resources
。
解决此问题的一种方法是为插件创建合并的Dictionary架构。在您的 MEF 插件接口上实施HasResource
bool
属性和ResourceDictionary/ResourceDictionaries
属性
当您加载插件时,只需检查这些属性,是否有资源只需通过
将它们添加到主机应用程序中Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);
其他资源
Application.Resources Property
获取或设置应用程序范围资源的集合,例如 风格和画笔。
ResourceDictionary.MergedDictionaries Property
获取ResourceDictionary词典的集合 构成合并中的各种资源词典 字典。
提供包含WPF的哈希表/字典实现 组件和WPF应用程序的其他元素使用的资源。