【问题标题】:How to provide XAML resources from MEF components如何从 MEF 组件提供 XAML 资源
【发布时间】:2012-05-10 08:59:18
【问题描述】:

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

但正如您可以想象的那样,这很乏味:我必须为每个 DataTemplate 添加代码才能提供,WPF 不会自动使用正确的 DataTemplate 来显示 ViewModel 的类型。

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

提前感谢您的帮助。

最好的问候

【问题讨论】:

    标签: wpf resources mef resourcedictionary


    【解决方案1】:

    我不知道在哪里找到了这个小技巧,但您可以做的一件事是在编写外部程序集时动态导入资源字典。

    在每个包含资源的程序集中,您可以通过隐藏代码并进行如下注释来导出一个或多个 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);
            }
    

    【讨论】:

    • 我基本上尝试了这个想法。我用类文件支持我的ResourceDictionary,因此可以轻松实例化它。向导页面现在可以合并该字典以“导入”其资源。非常感谢。
    • 为资源字典编写代码的一般想法对我来说是相当新的......这开辟了一个充满机遇的世界,很好。
    【解决方案2】:

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

    【讨论】:

    • 这意味着我在主程序中为组件的根ViewModel 声明了DataTemplate,对吗?我希望将组件的那些“实现细节”放在组件的程序集中。
    • 没有。我认为表示组件所在区域的 FrameworkElement 将作为参数传递给组件的代码。在主程序中为组件的根 ViewModel 声明 DataTemplate 没有意义,因为它不会使应用程序可组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多