我有一个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/

10-11 22:31
查看更多