Silverlight 使用模板绑定设置边框背景

Silverlight 使用模板绑定设置边框背景,silverlight,colors,background,templatebinding,Silverlight,Colors,Background,Templatebinding,Value=“{TemplateBinding HeaderColor}”我已经创建了自己的控件,我想知道是否可以将Border.Background绑定到模板属性。目前,我正在使用静态资源进行设置,如下所示: <Color x:Key="ControlMouseOverColor">green</Color> <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).

Value=“{TemplateBinding HeaderColor}”我已经创建了自己的控件,我想知道是否可以将Border.Background绑定到模板属性。目前,我正在使用静态资源进行设置,如下所示:

<Color x:Key="ControlMouseOverColor">green</Color>

<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
    <EasingColorKeyFrame KeyTime="0:0:6" Value="{StaticResource ControlMouseOverColor}" />
</ColorAnimationUsingKeyFrames>
第二个选项不起作用,我应该可以这样做吗?我没有得到一个错误,只是没有改变我设置的颜色

AngelWPF留下的评论要求更多的代码,粘贴在下面,我正处于学习创建控件的开始阶段,我想指出的是,因为还有很多东西我还没有做到,一次一块:)

generic.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:SelectionControl.Library"
xmlns:ctrl="clr-namespace:SelectionControl.Library;assembly=SelectionControl">

<LinearGradientBrush x:Key="HeaderBackground" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="Black" Offset="0" />
    <GradientStop Color="Gray" Offset="1" />
</LinearGradientBrush>

<Color x:Key="ControlMouseEnterColor">aliceblue</Color>
<Color x:Key="ControlMouseLeaveColor">Gray</Color>
<Color x:Key="ControlLeftMouseUpColor">Red</Color>

<Style TargetType="ctrl:Selection">
    <Setter Property="Width" Value="Auto" />
    <Setter Property="Height" Value="Auto" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Foreground" Value="AliceBlue" />
    <Setter Property="Margin" Value="2,2,2,2" />

    <Setter Property="Background" Value="{StaticResource ResourceKey=HeaderBackground}" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ctrl:Selection">
                <Grid x:Name="RootElement" Margin="{TemplateBinding Margin}">
                    <!-- Visual States -->
                     <VisualStateManager.VisualStateGroups>
                          <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="MouseEnter">
                              <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
                                        <EasingColorKeyFrame KeyTime="0:0:.5" Value="{TemplateBinding HeaderColor}" />
                                    </ColorAnimationUsingKeyFrames>
                              </Storyboard>
                            </VisualState>
                            <VisualState x:Name="MouseLeave">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
                                        <EasingColorKeyFrame KeyTime="0:0:1" Value="{StaticResource ControlMouseLeaveColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="MouseLeftUp">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
                                        <EasingColorKeyFrame KeyTime="0:0:1" Value="{StaticResource ControlLeftMouseUpColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    <!-- End Visual States-->

                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <!-- Header -->
                    <Border x:Name="headerLayout" Background="{TemplateBinding Background}" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CornerRadius="2,2,2,2" BorderBrush="Black" BorderThickness="1">
                        <StackPanel>
                            <ToggleButton ></ToggleButton>
                            <TextBlock Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding HeaderText}" FontWeight="{TemplateBinding FontWeight}" FontSize="{TemplateBinding FontSize}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </StackPanel>
                    </Border>
                    <!-- Body Content -->
                    <ContentPresenter Grid.Row="1" Content="{TemplateBinding Content}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</ResourceDictionary>

我在自定义依赖项属性上使用TemplateBinding的结果好坏参半。正因为如此,我使用了RelativeSourceTemplatedParent,它似乎适用于所有情况

<EasingColorKeyFrame KeyTime="0:0:.5" Value="{Binding HeaderColor, RelativeSource={RelativeSource TemplatedParent}}" />


您可以发布更多代码吗?在XAML中,您在哪里实际使用这个使用关键帧的彩色动画?在选择控件的控件模板内?如果是这样,TemplateBinding应该可以工作!嗨,AngelWPF,我在generic.xaml文件中添加了代码,在我的原始问题下面添加了控制类中的代码。谢谢你的帮助。是的,我正在使用模板中的ColorAnimationUsingKeyFrames,我打赌我遗漏了一些明显的东西。您能观察一下visual studio输出窗口中的模板绑定是否失败吗?当动画应该运行时,是否收到绑定错误?如果是,那么您可以尝试用普通绑定替换模板绑定,并使用RelativeSource={RelativeSource AncestorType={x:Type ctrl:Selection}}插入…您可以尝试普通绑定并使用RelativeSource={RelativeSource AncestorType={x:Type ctrl:Selection}代替TemplateBinding吗?不应该是这样的
public static readonly DependencyProperty HeaderColorProperty =
        DependencyProperty.Register("HeaderColor", typeof(System.Windows.Media.Color), typeof(Selection), new PropertyMetadata(System.Windows.Media.Colors.Red));

public  System.Windows.Media.Color HeaderColor {
    get { return (System.Windows.Media.Color)GetValue(HeaderColorProperty); }
    set { SetValue(HeaderColorProperty, value); }
}
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:SelectionControl.Library"
xmlns:ctrl="clr-namespace:SelectionControl.Library;assembly=SelectionControl">

<LinearGradientBrush x:Key="HeaderBackground" EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="Black" Offset="0" />
    <GradientStop Color="Gray" Offset="1" />
</LinearGradientBrush>

<Color x:Key="ControlMouseEnterColor">aliceblue</Color>
<Color x:Key="ControlMouseLeaveColor">Gray</Color>
<Color x:Key="ControlLeftMouseUpColor">Red</Color>

<Style TargetType="ctrl:Selection">
    <Setter Property="Width" Value="Auto" />
    <Setter Property="Height" Value="Auto" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Foreground" Value="AliceBlue" />
    <Setter Property="Margin" Value="2,2,2,2" />

    <Setter Property="Background" Value="{StaticResource ResourceKey=HeaderBackground}" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ctrl:Selection">
                <Grid x:Name="RootElement" Margin="{TemplateBinding Margin}">
                    <!-- Visual States -->
                     <VisualStateManager.VisualStateGroups>
                          <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="MouseEnter">
                              <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
                                        <EasingColorKeyFrame KeyTime="0:0:.5" Value="{TemplateBinding HeaderColor}" />
                                    </ColorAnimationUsingKeyFrames>
                              </Storyboard>
                            </VisualState>
                            <VisualState x:Name="MouseLeave">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
                                        <EasingColorKeyFrame KeyTime="0:0:1" Value="{StaticResource ControlMouseLeaveColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="MouseLeftUp">
                                <Storyboard>
                                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
                                        <EasingColorKeyFrame KeyTime="0:0:1" Value="{StaticResource ControlLeftMouseUpColor}" />
                                    </ColorAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    <!-- End Visual States-->

                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <!-- Header -->
                    <Border x:Name="headerLayout" Background="{TemplateBinding Background}" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CornerRadius="2,2,2,2" BorderBrush="Black" BorderThickness="1">
                        <StackPanel>
                            <ToggleButton ></ToggleButton>
                            <TextBlock Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding HeaderText}" FontWeight="{TemplateBinding FontWeight}" FontSize="{TemplateBinding FontSize}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </StackPanel>
                    </Border>
                    <!-- Body Content -->
                    <ContentPresenter Grid.Row="1" Content="{TemplateBinding Content}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</ResourceDictionary>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace SelectionControl.Library {
    [TemplateVisualState(Name = Selection.MouseEnterStateName, GroupName = Selection.CommonStatesGroupName)]
    [TemplateVisualState(Name = Selection.MouseLeaveStateName, GroupName = Selection.CommonStatesGroupName)]
    [TemplateVisualState(Name = Selection.MouseLeftUpStateName, GroupName = Selection.CommonStatesGroupName)]

public class Selection : ContentControl {
    public const string CommonStatesGroupName = "CommonStates";
    public const string MouseEnterStateName = "MouseEnter";
    public const string MouseLeaveStateName = "MouseLeave";
    public const string MouseLeftUpStateName = "MouseLeftUp";

    public Selection() {
        this.DefaultStyleKey = typeof(Selection);

        this.MouseEnter += new MouseEventHandler(OnMouseEnter);
        this.MouseLeave += new MouseEventHandler(OnMouseLeave);
        this.MouseLeftButtonUp += new MouseButtonEventHandler(OnMouseLeftButtonUp);
    }

    void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
        this.GoToState(Selection.MouseLeftUpStateName, true);
    }

    void OnMouseLeave(object sender, MouseEventArgs e) {
        this.GoToState(Selection.MouseLeaveStateName, true);
    }

    void OnMouseEnter(object sender, MouseEventArgs e) {
        this.GoToState(Selection.MouseEnterStateName, true);
    }
    private void GoToState(string stateName, bool useTransitions) {
        VisualStateManager.GoToState(this, stateName, useTransitions);
    }

    public static readonly DependencyProperty HeaderTextProperty =
        DependencyProperty.Register("HeaderText", typeof(string), typeof(Selection), new PropertyMetadata(""));

    public string HeaderText {
        get { return (string)GetValue(HeaderTextProperty); }
        set { SetValue(HeaderTextProperty, value); }
    }

    public static readonly DependencyProperty HeaderColorProperty =
        DependencyProperty.Register("HeaderColor", typeof(System.Windows.Media.Color), typeof(Selection), new PropertyMetadata(System.Windows.Media.Colors.Red));

    public  System.Windows.Media.Color HeaderColor {
        get { return (System.Windows.Media.Color)GetValue(HeaderColorProperty); }
        set { SetValue(HeaderColorProperty, value); }
    }
}}
<EasingColorKeyFrame KeyTime="0:0:.5" Value="{Binding HeaderColor, RelativeSource={RelativeSource TemplatedParent}}" />