Metro XAML - TemplateBinding和SolidColorBrush的问题

Dea*_*alk 5 xaml microsoft-metro windows-8 windows-runtime winrt-xaml

这是一个简单的自定义控件来说明我的问题

public sealed class TestControl : Control
{
    public static DependencyProperty TestColorProperty = DependencyProperty.Register("TestColor", typeof(Brush), typeof(TestControl), new PropertyMetadata(new SolidColorBrush(Colors.Blue)));

    public Brush TestColor
    {
        get { return (Brush)GetValue(TestColorProperty); }
        set { SetValue(TestColorProperty, value); }
    }

    public TestControl()
    {
        this.DefaultStyleKey = typeof(TestControl);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它具有单个Brush依赖项属性,默认值为Blue(PropertyMetaData如上所示设置).

这是我控制的XAML Generic.xaml

<Style TargetType="local:TestControl">
        <Setter Property="TestColor" Value="Red" />
        <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TestControl">
                <Border
                    Background="{TemplateBinding TestColor}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                        <TextBlock Text="TEST"  />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

如您所见,我在设置器中将TestColorBrush依赖项属性设置为Red Style- 覆盖我在PropertyMetaData中声明的默认值Blue.请注意,我的模板中的边框TemplateBinding用于设置画笔的背景,如上所述.

那么你认为边框背景设置的是什么颜色?红色还是蓝色?

答案都不是.

如果我在我的控件中设置了一个断点,此值应该可用(例如,OnApplyTemplate作为示例),则值为null,而不是预期的Red(默认值).实际上,我在控件的所有生命周期点都设置了断点,并且从不使用ProprtyMetaData中的默认值.

在样式中设置值也没有任何作用(根据我的样式设置器delaration,它没有设置为Blue.这表明样式设置器以SolidColorBrush某种方式失败.

但是,这有效

public BlankPage()
{
    this.InitializeComponent();
    testcont.TestColor = new SolidColorBrush(Colors.Orange);
}
Run Code Online (Sandbox Code Playgroud)

这也有效:

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <local:TestControl  TestColor="Green" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

但是TemplateBinding只是不起作用,这很重要,因为我试图编写可重复使用的自定义控件.

这是一个错误吗?

院长

not*_*cat 0

就我个人而言,我认为这是 xaml 解析器中某个地方的错误。尝试这样的事情,它应该有效:

    <Setter Property="SelectedDayBrush">
        <Setter.Value>
            <SolidColorBrush>#7F7F7F7F</SolidColorBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="SelectedDayBrush">
        <Setter.Value>
            <SolidColorBrush Color="Orange"/>
        </Setter.Value>
    </Setter>
Run Code Online (Sandbox Code Playgroud)