2010-02-12 6 views
14

Ich frage mich, ob mir jemand helfen kann - ich habe ein Label, das ich zwischen zwei beliebigen Farben überblenden kann, wenn eine Methode im Code dahinter aufgerufen wird.WPF ColorAnimation für eine Brush-Eigenschaft

Mein bester Versuch so weit:

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 

Das Problem, das ich habe ist, dass Color ein Media.Color zurückgibt und der Objekttyp für den Vordergrund ist Pinsel.

Ich weiß, wie man den richtigen Pinsel erstellt, aber nicht wie man es in einer Animation macht.

Von googeln, es scheint, ich brauche einen Konverter:

<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 

aber alle Beispiele, die ich binden es in XAML, um die Animation gesehen habe - und ich möchte es in der Code-behind zu tun. ..

Kann mir bitte jemand in die richtige Richtung zeigen?

Dank

Antwort

21

Die übliche Lösung dieses Problems ist nicht einen Konverter zu verwenden, sondern die Farbe der Bürste zu animieren. Dies ist jedoch was Sie tun einen PropertyPath benötigen, was wiederum bedeutet, dass Sie ein Storyboard benötigen:

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

(pardon C# Syntax)

Beachten Sie die Eigenschaft Pfad im SetTargetProperty Anruf, der durch den Vordergrund quert nach unten Eigenschaft und in die Eigenschaft Color des resultierenden Pinsels.

Sie auch diese Technik verwenden, können einzelne Gradienten zu animieren in einem Farbverlauf stoppt usw.

+0

Das ist wirklich elegant - ich werde es jetzt versuchen. [EDIT] Fehler: Die 'Color' Eigenschaft auf 'System.Windows.Media.SolidColorBrush' kann nicht animiert werden, da das Objekt versiegelt oder eingefroren ist. [Mein Code]: \t \t Dim br Wie SolidColorBrush = Direct ((PulseLogo.Foreground), SolidColorBrush) \t \t PulseLogo.Foreground.BeginAnimation (SolidColorBrush.ColorProperty, F) ‚Vielen Dank für jede Hilfe – Basic

+0

Sorry, Mann, ich durcheinander. Ich habe das bisher nur mit Storyboards gemacht und ich nahm naiv an, ich könnte das direkt in einen BeginAnimation-Call übersetzen, was falsch war. Ich habe die Antwort aktualisiert, jetzt mit tatsächlichen \ * Keuchen \ * ehrlich-zu-Gott getestet Code - hoffe, das funktioniert besser für Sie. – itowlson

+0

Keine Sorge für die C# - Sie sind so ähnlich, es ist kaum mehr als ein Dialekt :) Danke für die aktualisierte Lösung - es funktioniert einwandfrei. – 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 sind Klasse von Farbe, ist timespan Klasse von Timespan, ist BackGroundCellGrid Klasse von Grid ;

// keine Notwendigkeit, SolidColorBrush zu erstellen und in XAML daran zu binden; // Viel Spaß!