Как заставить ComponentResourceKey работать?
Я создаю приложение WPF с несколькими сборками и хочу поделиться между ними словарем ресурсов. Это требует ComponentResourceKey. Я создал небольшую демоверсию для тестирования CRK, и я не могу заставить ее работать.
У моей демонстрации есть два проекта: проект WPF с названием Demo и библиотека DLL с названием Common. Общий проект имеет папку под названием Темы. Он содержит мой словарь ресурсов, 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"); }
}
Наконец, главное окно в моем демонстрационном проекте ссылается на ресурс кисти для заполнения прямоугольника:
<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 ответ
Я нашел свою проблему. Я путал ключ ресурса компонента с идентификатором ресурса внутри словаря ресурсов. Другими словами, мой компонентный ключ ресурса был таким же, как и идентификатор ресурса. Я изменил свое статическое свойство на это:
public static ComponentResourceKey RedBrushKey
{
get {return new ComponentResourceKey(typeof(SharedResources), "RedSolidBrush"); }
}
Имя свойства теперь RedBrushKey вместо RedSolidBrush. И ключ сейчас работает.