如何从MEF组件提供XAML资源

时间:2012-05-10 08:59:18

标签: wpf resources mef resourcedictionary

我有一个导入MEF组件,它在导入向导打开时动态加载。一旦用户选择了她想要处理的导入类型,就会将对导入向导对话框的控制传递给所选的导入组件。 当然,导入组件需要为向导对话框提供资源(例如DataTemplate)。目前,这是通过导入组件提供的DataTemplateSelector实现的。他们访问导入组件程序集的本地ResourceDictionary

但是你可以想象,这很乏味:我必须为每个要提供的DataTemplate添加代码,WPF不会按DataTemplate的类型自动使用正确的ViewModel正在展示。

以前有人解决了这个问题吗?你们是如何在插件环境中提供资源的?

感谢您提前提供任何帮助。

祝你好运

2 个答案:

答案 0 :(得分:13)

我忘记了我发现这个小技巧的地方,但是你可以做的一件事是在组成外部程序集时动态导入资源字典。

在每个包含资源的程序集中,您可以通过后面的代码和注释来导出一个或多个ResourceDictionary对象:

[Export(typeof(ResourceDictionary))]
public partial class Resources : ResourceDictionary
{
    public Resources()
    {
        InitializeComponent();
    }
}

现在你需要一个解析[ImportMany] IEnumerable<ResourceDictionary> resourceDictionaries的组件并执行以下操作:

        //Merge exported resource dictionaries from all composed sources into the application
        foreach (var resourceDictionary in resourceDictionaries)
        {
            Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
        }

答案 1 :(得分:0)

如果导入的组件仅包含在应用程序的特定区域中,那么您只能将组件的根ViewModel的DataTemplate添加到FrameworkElement的Resources,该FrameworkElement表示组件所在的区域。然后,所有其他DataTemplates(对于导入组件中的其他ViewModel)将包含在DataTemplate的Resources中,用于组件的根ViewModel。