2010-02-12 13 views
14

Mi chiedo se qualcuno mi può aiutare - Ho un'etichetta che ho bisogno di essere in grado di dissolvenza incrociata tra qualsiasi 2 colori quando viene chiamato un metodo nel codice sottostante.WPF ColorAnimation per una proprietà Brush

mio miglior tentativo finora:

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 

Il problema che ho è che ColorAnimation restituisce un Media.Color e Il tipo di proprietà per il primo piano è spazzola.

So come creare il pennello appropriato ma non come farlo in un'animazione.

Da usare Google, sembra che ho bisogno di un convertitore:

<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 

ma tutti gli esempi che ho visto legano all'animazione in XAML - e mi piacerebbe farlo in codice dietro. ..

Qualcuno può indicarmi la direzione giusta?

Grazie

risposta

21

La solita soluzione a questo non è quello di utilizzare un convertitore, ma invece di animare il colore del pennello. Tuttavia, per fare questo è necessario un PropertyPath, che a sua volta significa che è necessario uno storyboard:

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# sintassi)

Nota il percorso di proprietà nella chiamata SetTargetProperty, che attraversa verso il basso attraverso il primo piano proprietà e nella proprietà Colore del pennello risultante.

È inoltre possibile utilizzare questa tecnica per animare gradiente individuo si ferma in un pennello sfumato, ecc

+0

Questo è davvero elegante - ci proverò ora. [EDIT] Errore: impossibile animare la proprietà 'Color' su 'System.Windows.Media.SolidColorBrush' perché l'oggetto è sigillato o congelato. [Il mio codice]: \t \t Dim br Come SolidColorBrush = DirectCast ((PulseLogo.Foreground), SolidColorBrush) \t \t PulseLogo.Foreground.BeginAnimation (SolidColorBrush.ColorProperty, F) 'Grazie per qualsiasi aiuto – Basic

+0

Siamo spiacenti, uomo, incasinato. L'ho fatto solo con gli storyboard e ho ingenuamente supposto di poterlo tradurre direttamente in una chiamata BeginAnimation, che era sbagliata. Ho aggiornato la risposta, ora con il codice effettivo di prova di "gasp \" onesto-buono, speriamo che funzioni meglio per voi. – itowlson

+0

Nessun problema per il C# - Sono così simili, è poco più di un dialetto :) Grazie per la soluzione aggiornata - funziona perfettamente. – 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 sono classe di colore, periodo è di classe TimeSpan, BackGroundCellGrid è classe di griglia ;

// non è necessario creare SolidColorBrush e collegarsi ad esso in XAML; // buon divertimento!