Impostazione dello sfondo del bordo con un'associazione di modello

Value = "{TemplateBinding HeaderColor}" Ho creato il mio controllo e mi chiedo se posso associare un Border.Background a una proprietà del modello . Attualmente lo sto impostando con una StaticResource come la seguente:

<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>

Vorrei che fosse una proprietà sul mio controllo e potessi impostarla come associazione di modelli

<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="headerLayout">
    <EasingColorKeyFrame KeyTime="0:0:6" Value="{TemplateBinding HeaderColor}" />
</ColorAnimationUsingKeyFrames>

MainPage.xaml

<ctrl:Selection Grid.Column="0" HeaderColor="Red" HeaderText="Header Text" />

la mia classe:

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); }
}

Questa seconda opzione non funziona, dovrei essere in grado di farlo? Non ricevo un errore, semplicemente non cambia nel colore che ho impostato.

Il commento lasciato da AngelWPF ha chiesto più codice, incollando di seguito, sono nelle fasi iniziali dell'apprendimento per creare un controllo, volevo nota che, poiché ci sono molte cose che non ho ancora imparato, un pezzo alla volta :)

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>

Selection.cs

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); }
    }
}}
5
задан Terco 1 August 2011 в 17:26
поделиться