是否可以在外部程序集中使用样式而不将它们合并到app.xaml的ResourceDictionary中?

时间:2012-10-02 01:10:31

标签: wpf xaml

我想要解决的所需方案如下:

  1. MyCompany.Styles.dll程序集中定义了一组常用样式。

  2. MyCompany.Controls.dll程序集中有一组自定义控件,它们使用MyCompany.Styles.dll程序集中的样式。

  3. 使用MyCompany.Controls.dll程序集中的控件的任何应用程序都不需要引用应用程序的app.xaml中的MyCompany.Styles.dll程序集中的任何ResourceDictionary,但样式将只解析给定的事实是它们被MyCompany.Controls.dll程序集引用和使用。

  4. 这可能吗?如果可以,怎么做?

    非常感谢,eugen

1 个答案:

答案 0 :(得分:0)

这是有可能的,所以我为任何偶然发现原始问题的人发布解决方案。

修复方法是将所需的样式合并到MyCompany.Controls.dll程序集中每个自定义控件的ResourceDictionary中。虽然我在XAML中没有成功完成此操作,但只需将下面的调用添加到每个自定义控件的构造函数中:

this.MergeInResources("/MyCompany.Styles;component/default.xaml");

执行魔术的扩展方法如下:

    /// <summary>
    /// Loads the resources pointed to by the (relative) path
    /// <paramref name="resourcePath"/> into the Merged Dictionaries
    /// of <paramref name="control"/>.
    /// </summary>
    internal static void MergeInResources(this FrameworkElement control,
                                          string resourcePath)
    {
        if (String.IsNullOrWhiteSpace(resourcePath))
            throw new ArgumentNullException("resourcePath");

        Uri uri = new Uri(resourcePath, UriKind.Relative);
        ResourceDictionary dictionary = (ResourceDictionary)Application.LoadComponent(uri);
        control.Resources.MergedDictionaries.Add(dictionary);
    }

错误处理和ResourceDictionary缓存+共享留给读者。