Как заставить ComponentResourceKey работать? - PullRequest
2 голосов
/ 14 сентября 2009

Я создаю приложение WPF с несколькими сборками и хочу поделиться словарем ресурсов среди них. Для этого требуется ComponentResourceKey . Я создал небольшую демоверсию для тестирования CRK, и я не могу заставить ее работать.

В моей демонстрации есть два проекта: проект WPF с именем Demo и библиотека DLL с именем Common . В проекте 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 Ответ

3 голосов
/ 14 сентября 2009

Я нашел свою проблему. Я путал ключ ресурса компонента с идентификатором ресурса внутри словаря ресурсов. Другими словами, мой компонентный ключ ресурса был таким же, как и идентификатор ресурса. Я изменил свое статическое свойство на это:

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

Имя свойства теперь RedBrushKey вместо RedSolidBrush . И ключ сейчас работает.

...