我有一个WPF应用程序here,它使用MVVMLight作为框架,处于MVVM模式中,并带有一个名为VCNEditor的UserControl的MEF插件。
主应用程序使用名为DialogBehavior类型的名为DialogViewModel的附加行为来显示对话框。 DialogBehavior负责通过以下方式将 View 绑定(bind)到其预先创建的DialogViewModel : IDialogViewModel
(首先是viewmodel):
var resource = Application.Current.TryFindResource(viewModel.GetType());
该插件是一个带有UserControl的库。 UserControl是从“扩展”目录动态加载的,只有在存在时才可见。到目前为止有效。我当前面临的问题是:我试图以与在主应用程序中相同的方式在插件中显示对话框。
含义:我定义了一个类型为“Dialogs”的属性
ObservableCollection<IDialogViewModel>
在我的UserControlViewModel : IDialogViewModel
和DataBind中将该属性添加到我的附加行为中。当我现在将新的DialogViewModel添加到该集合时
Application.Current.TryFindResource(viewModel.GetType())
无法找到任何资源,因为Application.Current返回主应用程序,并且库没有任何资源字典,例如主应用程序中的app.xaml。我无法将插件对话框的资源添加到主应用程序,因为这会破坏我松散耦合的插件体系结构。
我只是一个临时开发人员,如果有人可以指出我正确的方向,那就太好了。
当前的解决方法是,我在每个viewmodels构造中“手动”创建 View 。但是我认为这看起来很好。
感谢您的支持。
最佳答案
如果我对您的理解正确,则可以轻松地在代码中将插件样式和资源添加到Application.Current.Resources
中。
解决此问题的一种方法是为您的插件创建合并的Dictionary体系结构。在您的MEF插件接口(interface)上实现HasResource
bool
属性和ResourceDictionary/ResourceDictionaries
属性。
插件加载时,只需检查这些属性,如果有资源,只需通过以下方式将其添加到主机应用程序中
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);
其他资源
Application.Resources Property
ResourceDictionary.MergedDictionaries Property
ResourceDictionary Class
关于c# - 是否可以从/在库中查找或定义资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49445926/