Search code examples
c#uwptextblockforegroundstaticresource

UWP: application wide TextBlock foreground crashes app when set from static resource


I went through a lot of similar questions on SO, in regards to setting the foreground of a TextBlock through a static resource, but for whatever reason my UWP application keeps crashing on me.

I am starting to believe this is a limitation of UWP? Also, no stacktrace is generated from this.

I am using Microsoft Visual Studio Community 2022 v.17.2.6

ThemeColors.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <SolidColorBrush x:Key="MyOffWhiteBrush" Color="#eeeeee" />

</ResourceDictionary>

TextBlockStyle.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="{StaticResource MyOffWhiteBrush}" />
    </Style>

</ResourceDictionary>

App.xaml

<Application
    x:Class="TestTextBlock.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestTextBlock">

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ThemeColors.xaml" />
                <ResourceDictionary Source="TextBlockStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

MainPage.xaml

<Page
    x:Class="TestTextBlock.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestTextBlock"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid>
        <TextBlock Text="helloworld" />
    </Grid>
</Page>

UPDATE #1:

If I change TextBlockStyle.xaml to this it works.

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <SolidColorBrush x:Key="_" />
    
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="{StaticResource MyOffWhiteBrush}" />
    </Style>

</ResourceDictionary>

I don't understand why I need to declare an empty brush?


Solution

  • The reason for this behavior may be related to the Lookup behavior for XAML resource references and Forward references within a ResourceDictionary. You need to make sure the referenced resource must appear lexically before the resource reference when you use the resource.

    I agree with @Mark W, the possible workaround is that you could define the basic resource on top of other resources.

    In your scenario, it should be like this:

    <ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ThemeColors.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="{StaticResource MyOffWhiteBrush}" />
    </Style>