Пометить ресурс переднего плана

У меня есть небольшая проблема с WPF, которую я не могу понять.

Я пытаюсь настроить ResourceDictionary, содержащий несколько цветов, кистей и ControlTemplate записей.

Моя проблема в том, что я пытаюсь установить кисть переднего плана Label на ресурс в том же файле, и этот бит не работает, и об этом нет сообщений трассировки.

<Color x:Shared="false" x:Key="DefaultForegroundColor" A="255" R="0" G="0" B="0" />
<!--<Color x:Shared="false" x:Key="DefaultForegroundColor" A="255" R="255" G="0" B="0" />-->
<SolidColorBrush x:Shared="false" x:Key="DefaultForegroundBrush" Color="{DynamicResource DefaultForegroundColor}"/>

<Color x:Shared="false" x:Key="HeadingColor" A="255" R="17" G="158" B="218" />
<SolidColorBrush x:Shared="false" x:Key="HeadingBrush" Color="{DynamicResource HeadingColor}"/>


<Style TargetType="{x:Type Label}" x:Key="SectionHeadingStyle">
   <Setter Property="FontSize" Value="18"/>
   <Setter Property="Foreground" Value="{DynamicResource HeadingBrush}"/>
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="Label">
            <Border BorderThickness="0,0,0,2" BorderBrush="{DynamicResource DefaultForegroundBrush}" HorizontalAlignment="Left">
               <ContentPresenter Margin="5"/>
            </Border>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

Цвет границы работает нормально (даже если он не черный), но передний план этикетки остается черным, а не светло-голубым. Любые идеи, что я делаю неправильно?

Спасибо.

ОБНОВЛЕНИЕ Забыл упомянуть, что в дизайнере это тоже хорошо выглядит.

ОБНОВЛЕНИЕ 2 При отслеживании визуального дерева выясняется, что цвет Foreground проходит большую часть шаблона, пока ContentPresenter не использует TextBlock для отображения текста заголовка. TextBlock остается черным, в то время как ContentPresenter выше имеет приятный оттенок синего, установленный на TextElement.Foreground. Есть ли что-то еще, что я могу сделать в шаблоне, чтобы придать созданному TextBlock цвет переднего плана?


person GlacialSpoon    schedule 17.08.2012    source источник


Ответы (2)


Я вижу два возможных решения

вам нужно сделать ресурс StaticResource. Например, если вы измените кисть на эту, она будет работать:

<SolidColorBrush x:Shared="false" x:Key="HeadingBrush" Color="{StaticResource HeadingColor}"/>

Или если вы измените передний план в стиле на StaticResource, он будет работать.

Другой вариант — удалить x:Shared="false" как из кисти, так и из цвета. Это также решает проблему.

<Color x:Key="HeadingColor" A="255" R="17" G="158" B="218" />
<SolidColorBrush x:Key="HeadingBrush" Color="{DynamicResource HeadingColor}"/>

Кажется, это проблема с комбинацией нескольких слоев DynamicResource плюс неразделяемые ресурсы.

person Brian S    schedule 17.08.2012
comment
Привет Брайан. Я ранее изменил код из предложенной вами формы на версии x:Shared и DynamicResource, которые я разместил после другого (неправильного) сообщения в блоге. К сожалению означает, что я все еще без желаемого результата. - person GlacialSpoon; 17.08.2012
comment
@GlacialSpoon, каков ваш желаемый результат? Я могу понять стремление к DynamicResources (скины или что-то в этом роде?), но почему ими нельзя поделиться? - person Brian S; 17.08.2012
comment
Прости Брайан. Чтобы уточнить, желаемый результат — это цвет переднего плана в стиле, который фактически применяется к содержимому метки во время выполнения. Стиль определяет HeadingColor как голубой, но результирующее содержимое всегда черное. В моем текущем приложении контент, скорее всего, представляет собой строку, поэтому я решил, что он будет отображать текст в цвете переднего плана. Я не слишком беспокоюсь о методе или о том, является ли он статическим, динамическим или каким-либо другим. Я просто не могу заставить его раскрасить мой текст! :( Пожалуйста, скажите, если это все еще сбивает с толку. - person GlacialSpoon; 18.08.2012
comment
Итак, указанные выше изменения (изменение на StaticResource или удаление `x:Shared=false) не работают для вас? Я проверил ваш код, и любое из этих изменений решило проблему для меня. - person Brian S; 18.08.2012
comment
Нет, извините, не знаю, что я делаю, но цвет переднего плана стилизованной метки всегда черный. Маленькая подчеркивающая рамка получает цвет без проблем. Я дважды проверю остальную часть визуального дерева, может быть, прощупаю его. Если это помогает, проблемный элемент является частью UserControl, который затем находится в главном окне. - person GlacialSpoon; 20.08.2012

Только что понял, что никогда не закрывал этот вопрос:

В итоге появилась библиотека, импортирующая ресурсы на уровне приложения. По какой-то причине это вызвало конфликт с моими ресурсами, и ни один из них не был применен. Перемещение ресурсов библиотеки на уровень Window или UserControl устранило проблему.

person GlacialSpoon    schedule 02.10.2012