2010-02-12 17 views
14

Me pregunto si alguien me puede ayudar. Tengo una etiqueta que necesito para poder distinguir entre dos colores cuando se invoca un método en el código subyacente.WPF ColorAnimation para una propiedad de pincel

Mi mejor intento hasta el momento:

Private OldColor as Color = Colors.White 
Sub SetPulseColor(ByVal NewColor As Color) 
    Dim F As New Animation.ColorAnimation(OldColor, NewColor, New Duration(TimeSpan.Parse("00:00:01"))) 
    OldColor = NewColor 
    F.AutoReverse = False 
    PulseLogo.BeginAnimation(Label.ForegroundProperty, F) 

End Sub 

El problema que tengo es que ColorAnimation devuelve un Media.Color y el tipo de propiedad de primer plano es cepillo.

Sé cómo crear el pincel apropiado pero no cómo hacerlo en una animación.

De buscar en Google, parece que necesito un convertidor:

<ValueConversion(GetType(SolidColorBrush), GetType(SolidColorBrush))> _ 
Public Class ColorConverter 
    Implements IValueConverter 

Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert 
     Dim Color As Color = DirectCast(value, Color) 
     Return New SolidColorBrush(Color) 
    End Function 

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack 
     Return Nothing 
    End Function 

End Class 

pero todos los ejemplos que he visto que se unen a la animación en XAML - Y me gustaría hacerlo en el código subyacente. ..

¿Puede alguien señalarme en la dirección correcta?

Gracias

Respuesta

21

La solución habitual a este no es el uso de un convertidor, pero en vez de animar el color del pincel. Sin embargo, para ello es necesario un PropertyPath, que a su vez significa que necesita un guión gráfico:

Storyboard s = new Storyboard(); 
s.Duration = new Duration(new TimeSpan(0, 0, 1)); 
s.Children.Add(F); 

Storyboard.SetTarget(F, PulseLogo); 
Storyboard.SetTargetProperty(F, new PropertyPath("Foreground.Color")); 

s.Begin(); 

(perdón sintaxis de C#)

Anote la ruta de propiedad en la llamada SetTargetProperty, que atraviesa a través del primer plano propiedad y en la propiedad Color resultante del pincel.

También puede utilizar esta técnica para animar gradiente individuo deja en un cepillo de gradiente, etc.

+0

Eso es realmente elegante, lo intentaré ahora. Error [EDITAR]: No se puede animar la propiedad 'Color' en 'System.Windows.Media.SolidColorBrush' porque el objeto está sellado o congelado. [Mi código]: \t \t Dim br Como SolidColorBrush = DirectCast ((PulseLogo.Foreground), SolidColorBrush) \t \t PulseLogo.Foreground.BeginAnimation (SolidColorBrush.ColorProperty, F) 'Gracias por cualquier ayuda – Basic

+0

Lo sentimos, hombre, hecho un desastre. Solo he hecho esto con guiones gráficos antes e ingenuamente asumí que podía traducirlo directamente en una llamada a BeginAnimation, lo cual era incorrecto. Actualicé la respuesta, ahora con el código real probado \ * gasp \ * honesto, espero que esto funcione mejor para usted. – itowlson

+0

No se preocupe por el C# - Son muy similares, es poco más que un dialecto :) Gracias por la solución actualizada, funciona perfectamente. – Basic

0
  ColorAnimation colorChangeAnimation = new ColorAnimation(); 
      colorChangeAnimation.From = VariableColour; 
      colorChangeAnimation.To = BaseColour; 
      colorChangeAnimation.Duration = timeSpan; 

      PropertyPath colorTargetPath = new PropertyPath("(Panel.Background).(SolidColorBrush.Color)"); 
      Storyboard CellBackgroundChangeStory = new Storyboard(); 
      Storyboard.SetTarget(colorChangeAnimation, BackGroundCellGrid); 
      Storyboard.SetTargetProperty(colorChangeAnimation, colorTargetPath); 
      CellBackgroundChangeStory.Children.Add(colorChangeAnimation); 
      CellBackgroundChangeStory.Begin(); 

// VariableColour & BaseColour son de clase de Color, intervalo de tiempo es de clase de TimeSpan, BackGroundCellGrid es la clase de cuadrícula ;

// no es necesario crear SolidColorBrush y vincularlo en XAML; // ¡diviértete!

Cuestiones relacionadas