WPF:访问控件程序集中的资源

3

我有一个控件希望在XAML文件中声明资源。如果这是一个用户控件,我可以把资源放在<UserControl.Resources>块中,并通过this.Resources["myResourceKey"]在代码中引用它们。那么如何在控件中实现相同的功能呢?目前,我唯一与XAML相关的链接是通过控件的静态构造函数来引用样式(和控件模板)。

static SlimlineSimpleFieldTextBlock() {
         DefaultStyleKeyProperty.OverrideMetadata(typeof(SlimlineSimpleFieldTextBlock), new FrameworkPropertyMetadata(typeof(SlimlineSimpleFieldTextBlock)));
}

但是,即使我在XAML中添加一个块<Style.Resources>,似乎也无法引用它们(因为在应用模板阶段样式为空),即使我这样做了,如果有人覆盖了样式,我也会失去我的资源。

1个回答

5
使用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)]

神奇!那么问题就出现了,如果您想从多个控件访问这些资源,该怎么办?您会使用packURI还是可以在不同的控件中多次使用它们? - Aran Mulholland
1
我已经更新了我的答案,并添加了一些注释,以使其更加清晰。享受吧! - Ray Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接