使用
ComponentResourceKey
构建您的资源键。普通资源键只会在可视树和应用程序资源中进行搜索。但是,任何作为
ComponentResourceKey
的资源键也会在包含类型的程序集的主题字典中进行搜索。(对于用作资源键的
Type
对象也是如此。)
在包含名为“Sandwich”的控件的程序集的Themes / Generic.xaml中,您可能会有以下内容:
<SolidColorBrush x:Key="{ComponentResourceKey local:Sandwich, Lettuce}"
Color="#00FF00" />
<ControlTemplate x:Key="{ComponentResourceKey local:Sandwich, PeanutButter}" ...>
...
</ControlTemplate>
您可以像这样在代码中引用这些资源:
var lettuce = (Brush)FindResource(
new ComponentResourceKey(typeof(Sandwich), "Lettuce"));
var penutButter = (ControlTemplate)FindResource(
new ComponentResourceKey(typeof(Sandwich), "PeanutButter"));
您也可以像这样在XAML中引用这些资源:
<Border Background="{StaticResource ResourceKey={ComponentResourceKey local:Sandwich, Lettuce}}" />
这两种引用方式都可以在任何使用FindResource的地方使用,包括任何派生自FrameworkElement、FrameworkContentElement或Application对象的代码或XAML。
其他注意事项
ComponentResourceKey资源的搜索算法只涉及到包含指定类型的程序集,而不涉及类型本身。因此,如果Soup类和Sandwich类在同一个程序集中,Soup类型的控件可以使用{ComponentResourceKey local:Sandwich,Seasonings}
的ComponentResourceKey。只要ComponentResourceKey的所有内容完全匹配并且资源实际上与给定类型位于同一个程序集中,该资源就会被找到。
还要注意的是,虽然可以使用pack URI从另一个程序集中加载ResourceDictionary,但这样做是不明智的。与Themes/Generic.xaml解决方案不同的是,您实际上必须修改使用控件的应用程序,并且还存在多次包含和覆盖问题。
每当使用Themes/Generic.xaml时,必须正确设置control library's AssemblyInfo.cs文件中的ThemeInfoAttribute。您可以从以下内容开始:
[assembly:ThemeInfoAttribute(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]