让ComponentResourceKey工作?

时间:2009-09-14 16:12:48

标签: wpf componentresourcekey

我正在构建一个包含多个程序集的WPF应用程序,我想在它们之间共享一个资源字典。这需要ComponentResourceKey。我已经构建了一个小型演示来测试CRK,我似乎无法让它工作。

我的演示有两个项目,一个名为演示的WPF项目,以及一个名为 Common 的DLL。 Common 项目有一个名为 Themes 的文件夹。它包含我的资源字典 generic.xaml 。这是资源字典的文本:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Common" >

    <SolidColorBrush 
        x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:SharedResources}, ResourceId=RedSolidBrush}" 
        Color="Red"/>

</ResourceDictionary>

Common 还包含一个名为 SharedResources.cs 的类。它包含一个用于引用字典中Brush属性的属性:

public static ComponentResourceKey RedSolidBrush
{
    get { return new ComponentResourceKey(typeof (SharedResources), "RedSolidBrush"); }
}

最后,我的 Demo 项目中的主窗口引用了画笔资源来填充矩形:

<Window x:Class="ComponentResourceKeyDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:res="clr-namespace:Common;assembly=Common"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Rectangle Height="100" Width="100" Stroke="Black" Fill="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type res:SharedResources}, ResourceId=RedSolidBrush}}" />
    </Grid>
</Window>

我找不到它不起作用的原因。它在VS 2008和Blend中编译得很好,但是没有调用资源。我唯一的线索是Blend中的错误信息:

The Resource "{ComponentResourceKey ResourceId=RedSolidBrush, TypeInTargetAssembly={x:Type res:SharedResources}}" could not be resolved.

知道为什么这不起作用?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

我发现了我的问题。我将组件资源键与资源字典中的资源ID混淆。换句话说,我的组件资源键与资源ID相同。我将我的静态属性更改为:

public static ComponentResourceKey RedBrushKey
{
    get {return new ComponentResourceKey(typeof(SharedResources), "RedSolidBrush"); }
}

属性名称现在是 RedBrushKey ,而不是 RedSolidBrush 。关键是现在正在发挥作用。