在样式中使用DependencyProperty

时间:2015-05-10 03:49:04

标签: xaml windows-8.1

我有带依赖属性的TemplatedControl:

public static readonly DependencyProperty ColorProperty = DependencyProperty.Register(
            "Color", typeof(SolidColorBrush), typeof(MenuButton), new PropertyMetadata(default(SolidColorBrush)));

public SolidColorBrush Color
{
   get { return (SolidColorBrush)GetValue(ColorProperty); }
   set { SetValue(ColorProperty, value); }
}

在我希望使用此属性设置背景的样式中。我试过了:

<Style TargetType="controls:MenuButton" x:Name="MenuButtonSimple">
   <Setter Property="Background" Value="{Binding Color, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>

<Style TargetType="controls:MenuButton" x:Name="MenuButtonSimple">
   <Setter Property="Background" Value="{TemplateBinding Color}"/>

但它没有用。

如果我在模板中设置固定颜色 - 它可以工作:

<Style TargetType="controls:MenuButton" x:Name="MenuButtonSimple">
   <Setter Property="Background" Value="667788"/>

如何在样式中使用依赖属性(Color)?

1 个答案:

答案 0 :(得分:1)

我创建了一个名为MenuButton.cs的CustomControl:

在Generic.xaml中我有:

<Style TargetType="{x:Type local:MenuButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MenuButton}">
                <Border Background="{TemplateBinding Color}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当你看到TemplateBinding Color时,没有像用户控件那样复杂,然后:

public class MenuButton : Control
{
    public static readonly DependencyProperty ColorProperty = DependencyProperty.Register(
        "Color", typeof(SolidColorBrush), typeof(MenuButton), new PropertyMetadata(new SolidColorBrush(Colors.Red)));

    public SolidColorBrush Color
    {
        get { return (SolidColorBrush)GetValue(ColorProperty); }
        set { SetValue(ColorProperty, value); }
    }

    static MenuButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MenuButton), new FrameworkPropertyMetadata(typeof(MenuButton)));
    }
}

我把刷子换成红色只是为了测试,注意我为WPF做的。

如果您在模板外需要它,则可以:

 <Style TargetType="{x:Type local:MenuButton}">
    <Setter Property="Background" Value="{Binding Color, RelativeSource={RelativeSource Self}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MenuButton}">
                <Grid Background="{TemplateBinding Background}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

确实我添加了

<Setter Property="Color" Value="Orange"/>

并且将背景改变为魅力。