我做了类似提到的类似的事情DataTemplates
。我使用MEF加载插件,然后在启动时加载了对andDictionary
的引用。该插件使用 3 个主要组件构建。ViewModel
View
IBasePlugin.cs
这个简单的界面允许我们为插件创建一个骨架。这将只包含非常基础的内容,因为这是我们将Import
使用MEF
.
public interface IBasePlugin
{
WorkspaceViewModel ViewModel { get; }
ResourceDictionary View{ get; }
}
插件.cs
下一部分是Plugin.cs
文件。它包含我们插件的所有属性,以及所有必要的参考;比如我们的View
& ViewModel
。
[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...
}
查看.xaml
这是一个DataTemplate
包含对插件的引用View
和ViewModel
. 这就是我们将用于Plugin.cs
加载到主应用程序中的内容,以便应用程序WPF
知道如何将所有内容绑定在一起。
<DataTemplate DataType="{x:Type vm:MyPluginViewModel}">
<vw:MyPluginView/>
然后,我们使用MEF加载所有插件,将它们提供给我们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
都从我们的插件加载到我们的应用程序中,我们可以使用例如 a 来显示集合TabControl
。
<TabControl ItemsSource="{Binding Workspaces}"/>
我在这里也给出了类似的答案以及一些您可能会感兴趣的其他细节。