我想要解决的所需方案如下:
MyCompany.Styles.dll程序集中定义了一组常用样式。
MyCompany.Controls.dll程序集中有一组自定义控件,它们使用MyCompany.Styles.dll程序集中的样式。
使用MyCompany.Controls.dll程序集中的控件的任何应用程序都不需要引用应用程序的app.xaml中的MyCompany.Styles.dll程序集中的任何ResourceDictionary,但样式将只解析给定的事实是它们被MyCompany.Controls.dll程序集引用和使用。
这可能吗?如果可以,怎么做?
非常感谢,eugen
答案 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缓存+共享留给读者。