2010-12-02 13 views
5

Estoy escribiendo un control personalizado para una aplicación WPF. Quiero utilizar una animación de color en Storyboard en una definición VisualState. La propiedad To de esa animación debe estar vinculada a una propiedad de dependencia de mi objeto de control. Esto no parece funcionar.Uso del enlace en VisualState Storyboard

He encontrado un hilo en un foro de Silverlight describiendo exactamente el mismo problema, en el que se afirma que esto funciona en SL4 RTM: http://forums.silverlight.net/forums/p/174655/423324.aspx. Sin embargo, cuando intento usar el código publicado en mi aplicación VS2010 WPF, no funciona, lo que significa que el color no cambia. El único enlace que he podido hacer dentro de un VisualStateStoryboard es a StaticResource.

¿Alguna idea?

EDIT:

Agregado fragmentos de código:

de Generic.xaml:

<Style TargetType="{x:Type local:TestCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:TestCustomControl}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Name="MyBorder"> 
        <Border.Background> 
         <SolidColorBrush Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ColdColor}" /> 
        </Border.Background> 

        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <!-- This works: --> 
            <!--<ColorAnimation Storyboard.TargetProperty="Background.Color" Storyboard.TargetName="MyBorder" To="Red" Duration="0:0:0.2"/>--> 

            <!-- This also works: --> 
            <!--<ColorAnimation Storyboard.TargetProperty="Background.Color" Storyboard.TargetName="MyBorder" To="{StaticResource HotColorRes}" Duration="0:0:0.2"/>--> 

            <!-- This doesn't work: --> 
            <ColorAnimation Storyboard.TargetProperty="Background.Color" Storyboard.TargetName="MyBorder" To="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HotColor}" Duration="0:0:0.2"/> 

           </Storyboard> 
          </VisualState> 

         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

TestCustomControl.cs:

public class TestCustomControl : Button 
{ 
    static TestCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(TestCustomControl), new FrameworkPropertyMetadata(typeof(TestCustomControl))); 
    } 

    public Color HotColor 
    { 
     get { return (Color)GetValue(HotColorProperty); } 
     set { SetValue(HotColorProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for HotColor. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty HotColorProperty = 
     DependencyProperty.Register("HotColor", typeof(Color), typeof(TestCustomControl), new UIPropertyMetadata(Colors.Aqua)); 

    public Color ColdColor 
    { 
     get { return (Color)GetValue(ColdColorProperty); } 
     set { SetValue(ColdColorProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ColdColor. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ColdColorProperty = 
     DependencyProperty.Register("ColdColor", typeof(Color), typeof(TestCustomControl), new UIPropertyMetadata(Colors.Aqua)); 
} 
+0

¿Por qué no publica aquí el fragmento de código relevante? – Nawaz

+0

Se agregaron fragmentos de código. – NPVN

Respuesta

1

Funcionará como se esperaba si se especifica x:Name atributo para <ColorAnimation> en Generic.xaml así:

<!-- This WILL work: --> 
<ColorAnimation x:Name="PART_ColorAnimation" 
       Storyboard.TargetProperty="Background.Color" 
       Storyboard.TargetName="MyBorder" 
       Duration="0:0:0.2" /> 

y enlace de conjunto de To propiedad más adelante en el código atrás en el tiempo cuando la plantilla se aplica ya a controlar anulando OnApplyTemplate() en TestCustomControl.cs:

public override void OnApplyTemplate() 
{ 
    var colorAnimation = (ColorAnimation)Template.FindName("PART_ColorAnimation", this); 

    if(colorAnimation == null) 
     return; 

    var binding = new Binding("HotColor") { Source = this }; 
    BindingOperations.SetBinding(colorAnimation, 
           ColorAnimation.ToProperty, 
           binding); 
} 

Espero que ayuden.

+0

Confirmado, esto funciona dentro de controles personalizados. Si lo intentas en xaml, obtienes el temido error "No se puede encontrar FrameworkElemento o FrameworkContentElement para el elemento de destino". – FreddyFlares

Cuestiones relacionadas