控件模板上的WPF设置

时间:2010-03-02 09:26:10

标签: wpf wpf-controls styles controltemplate

一般问题。我有一个相当复杂的ControlTemplate。几个TextBox等 我不能使用TemplateBinding将所有属性带到表面,以便我可以设置所有样式。

Style有没有办法'delv'进入控件中的控件来设置值?

希望我的问题很清楚,没有例子。

由于

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的。 ControlTemplate本质上是一个黑盒子,至少在涉及XAML的地方(有很多方法可以在代码中挖掘可视树)。

当你说“不能使用TemplateBinding”时,为什么不呢?如果您没有足够的可用属性,可以通过为要传递的值创建一些附加属性来修复这些属性。这假设您正在模拟一个无法更改的控件,否则您只需添加新的依赖项属性。

附属物:

public static class CustomProps
{
    public static readonly DependencyProperty MyNewBrushProperty = DependencyProperty.RegisterAttached(
        "MyNewBrush",
        typeof(Brush),
        typeof(CustomProps),
        new UIPropertyMetadata(Brushes.Green));

    public static Brush GetMyNewBrush(DependencyObject target)
    {
        return (Brush)target.GetValue(MyNewBrushProperty);
    }

    public static void SetMyNewBrush(DependencyObject target, Brush value)
    {
        target.SetValue(MyNewBrushProperty, value);
    }
}

在样式和模板中使用:

<Style TargetType="{x:Type Button}">
    <Setter Property="local:CustomProps.MyNewBrush" Value="Red" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:CustomProps.MyNewBrush)}">
                    <ContentPresenter/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用此方法仍允许覆盖单个实例上的值。