Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.0k views
in Technique[技术] by (71.8m points)

c# - 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?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...