Search code examples
c#wpfxamlstyles

Why are root level attributes ignored for custom classes in XAML?


Consider the following simple XAML:

<TextBlock x:Class="MyTextBlock"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           Foreground="Red">
</TextBlock>

And the associated C# code:

public partial class MyTextBlock : TextBlock
{
    public MyTextBlock()
    {
    }
}

Why does the Foreground="Red" part not work when I then do <MyTextBlock Text="Foo"/> in my application? I know there are plenty of other ways to do it in code, but I have trouble understanding what is happening exactly here.

I have also tried the following XAML:

<TextBlock x:Class="MyTextBlock"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Foreground" Value="Red"/>
        </Style>
    </TextBlock.Style>
</TextBlock>

And finally this one:

<TextBlock x:Class="MyTextBlock"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock.Resources>
        <Style x:Key="MyTextBlockStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="Foreground" Value="Red"/>
        </Style>
    </TextBlock.Resources>
    <TextBlock.Style>
        <DynamicResource ResourceKey="MyTextBlockStyle"/>
    </TextBlock.Style>
</TextBlock>

Again, neither of these appear to apply the style. Why is that? Is there a way to declare some kind of default style for the root element in XAML?


Solution

  • Why does the Foreground="Red" part not work when I then do <MyTextBlock Text="Foo"/> in my application?

    It works if you call InitializeComponent():

    public partial class MyTextBlock : TextBlock
    {
        public MyTextBlock()
        {
            InitializeComponent();
        }
    }
    

    Local values take precedence over Style setters.