2011-07-30 16 views
5

Value = "{TemplateBinding HeaderColor}" Creé mi propio control, y me pregunto si puedo vincular un Border.Background a una propiedad de plantilla. Actualmente estoy configurarlo con un StaticResource como la siguiente:Configuración de fondo del borde con un enlace de plantilla

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

me gustaría que sea una propiedad de mi control, y ser capaz de configurarlo como un modelo vinculante

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

mi clase:

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

Esta segunda opción no funciona, ¿debería ser capaz de hacer esto? No obtengo un error, simplemente no cambia el color que configuro.

Comentario dejado por AngelWPF pedido más código, pegando a continuación, estoy en las etapas iniciales de aprender a crear un control, quería tener en cuenta que, porque hay mucho que todavía no tengo, una pieza en un tiempo :)

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

¿Puedes publicar más código? ¿En qué parte de tu XAML estás usando este ColorAnimationUsingKeyFrames en realidad? ¿Dentro de la plantilla de control del control de selección? Si es así, ¡TemplateBinding debería funcionar! –

+0

Hola AngelWPF Agregué el código en mi archivo generic.xaml, y el código en mi clase de control debajo de mi pregunta original. Gracias por cualquier ayuda. Sí, estoy usando ColorAnimationUsingKeyFrames dentro de mi plantilla, apuesto a que me falta algo obvio. – Terco

+1

¿Puedes observar si el enlace de la plantilla está fallando en la ventana de resultados de tu estudio visual? ¿Recibes errores vinculantes cuando se supone que se debe ejecutar la animación? Si es así, puede intentar reemplazar el enlace de la plantilla con el enlace normal y usar RelativeSource = {RelativeSource AncestorType = {x: Type ctrl: Selection}} inserta ... –

Respuesta

6

he tenido resultados mixtos utilizando TemplateBinding en las propiedades de dependencia personalizado. Debido a esto, he usado RelativeSource TemplatedParent, que parece funcionar en todas las situaciones.

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

Muchas gracias, ¡funcionó de maravilla! – Terco

Cuestiones relacionadas