GlacialSpoon
GlacialSpoon

Reputation: 387

Label foreground resource

I've got a small WPF issue here that I can't figure out.

I'm trying to set up a ResourceDictionary containing a number of colors, brushes and ControlTemplate entries.

My problem is that I'm trying the set the foreground brush of a Label to a resource in the same file and that bit isn't working and there's no trace messages about it.

<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>

The border colour works fine (even when it's not black) but the foreground of the label remains black instead of a light blue. Any ideas what I'm doing wrong?

Thanks.

UPDATE Forgot to mention that it looks good in the designer too.

UPDATE 2 Upon Snooping the Visual Tree it appears that the Foreground colour makes it most of way through the template until the ContentPresenter uses a TextBlock to display the header text. The TextBlock remains black while the ContentPresenter above has a nice shade of blue set to TextElement.Foreground. Is there something else I can do in the Template to give the created TextBlock the foreground colour?

Upvotes: 0

Views: 2255

Answers (2)

GlacialSpoon
GlacialSpoon

Reputation: 387

Just realised I never closed this question:

In the end there was a library importing resources at application level. For some reason these caused a conflict with my resources and neither were applied. Moving the library's resources to Window or UserControl level fixed the issue.

Upvotes: 1

Brian S
Brian S

Reputation: 5785

I see two possible solutions

you need to make the resource a StaticResource. For example, if you change the brush to this it works:

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

Or if you change the Foreground in the style to a StaticResource, it will work.

The other option is to remove the x:Shared="false" from both the brush and the color. That resolves the issue also.

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

It seems to be an issue with the combination of multiple layers of DynamicResource plus the non-shared resources.

Upvotes: 2

Related Questions