是的,我能够通过以下方式完成这项工作:
在我的主机 WPF 应用程序中,我添加了这个导入:
[ImportMany("ApplicationResources", typeof(ResourceDictionary))]
public IEnumerable<ResourceDictionary> Views { get; set; }
然后在我的复合部分中,我在常规 ResourceDictionary Xaml 文件中声明了 ViewModel 和 ViewModel 的数据模板。然后我为 ResourceDictionary 创建了一个代码,如下所示(在此示例中,ViewModel 称为 ItemViewModel,ResourceDictionary 称为 ItemView):
[Export("ApplicationResources", typeof(ResourceDictionary))]
public partial class ItemView : ResourceDictionary
{
public ItemView()
{
InitializeComponent();
}
}
作为参考,示例 ResourceDictionary 的 Xaml 如下所示:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyCompany.MyProduct"
x:Class="MyCompany.MyProduct.ItemView">
<DataTemplate DataType="{x:Type local:ItemViewModel}">
...
</DataTemplate>
</ResourceDictionary>
然后,回到我的主机 WPF 应用程序,在我成功撰写之后,在我显示主窗口之前,我这样做:
// Add the imported resource dictionaries
// to the application resources
foreach (ResourceDictionary r in Views)
{
this.Resources.MergedDictionaries.Add(r);
}
这似乎成功地在 WPF 看到 ItemViewModel 的任何地方应用 DataTemplate。
编辑:对于任何感兴趣的人,我发布了一个名为SoapBox Core的开源应用程序框架,它广泛使用这种方法将视图导入应用程序资源。它工作得很好,你可以自己下载源代码,看看它是如何工作的。