c# – 从插件程序集将WPF UI加载到MVVM应用程序中
我正在使用一个使用插件架构扩展其功能的应用程序.从插件中加载
WPF UI的最佳方法是什么?
我将列出一个列出所有可用插件的列表框.当选择插件时,插件中定义的WPF UI应显示在ContentControl中.我认为的选择包括: >需要创建一个实现特定接口的UserControl.我认为这将使插件创建变得容易.实现一个界面,你很好.这个方法的问题是如何将UserControl动态加载到ContentControl中.另外,由于我正在使用MVVM设计模式,因此DataTemplate似乎比UserControl更受欢迎. 如果我选择第二个选项,我想我可以像this answer describes.一样选择DataTemplate 你认为哪种方法更好?还是有更好的方法来完成这个? 解决方法
我做了类似于DataTemplates提到的类似的东西.我使用
MEF加载插件,然后在启动时加载了一个引用ViewModel和View的Dictionary.该插件使用3个主要组件构建.
IBasePlugin.cs 这个简单的界面允许我们为插件创建一个框架.这将只包含非常基础,因为我们将使用MEF导入插件到我们的主应用程序. public interface IBasePlugin { WorkspaceViewModel ViewModel { get; } ResourceDictionary View{ get; } } Plugin.cs 下一部分是Plugin.cs文件.它包含我们的插件的所有属性,以及所有必要的参考;例如我们的View&视图模型. [Export(typeof(IBasePlugin))] public class Plugin : IBasePlugin { [Import] private MyPluginViewModel _viewModel { get; set; } private ResourceDictionary _viewDictionary = new ResourceDictionary(); [ImportingConstructor] public Plugin() { // First we need to set up the View components. _viewDictionary.Source = new Uri("/Extension.MyPlugin;component/View.xaml",UriKind.RelativeOrAbsolute); } ....Properties... } View.xaml 这是一个DataTemplate,其中包含一个对View和ViewModel插件的引用.这就是我们将使用Plugin.cs加载到主应用程序,以便应用程序和WPF将知道如何绑定所有内容. <DataTemplate DataType="{x:Type vm:MyPluginViewModel}"> <vw:MyPluginView/> 然后,我们使用MEF加载所有插件,将它们提供给负责处理插件的Workspace ViewModel,并将它们存储在将用于显示所有可用插件的ObservableCollection中. 我们用来加载插件的代码看起来像这样. var plugins = Plugins.OrderBy(p => p.Value.ViewModel.HeaderText); foreach (var app in plugins) { // Take the View from the Plugin and Merge it with,// our Applications Resource Dictionary. Application.Current.Resources.MergedDictionaries.Add(app.Value.View) // THen add the ViewModel of our plugin to our collection of ViewModels. var vm = app.Value.ViewModel; Workspaces.Add(vm); } 一旦Dictinoary和ViewModel都从我们的插件加载到我们的应用程序中,我们可以使用TabControl来显示集合. <TabControl ItemsSource="{Binding Workspaces}"/> 我也给出了类似的答案here以及一些您可能会感兴趣的其他细节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |