2010-02-12 17 views
14

Zastanawiam się, czy ktoś może mi pomóc - mam etykietę, która musi być w stanie przejść między dwoma dowolnymi kolorami, gdy metoda jest wywoływana w kodzie za.WPA ColorAnimation dla właściwości pędzla

Moja najlepsza próba tej pory:

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 

Problem mam to, że ColorAnimation zwraca Media.Color i rodzaju nieruchomości na pierwszym planie jest szczotka.

Wiem, jak utworzyć odpowiedni pędzel, ale nie jak to zrobić w animacji.

Od Googling wydaje się, że potrzebny jest konwerter:

<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 

ale wszystkie przykłady Widziałem powiązać go z animacji w XAML - I chciałbym to zrobić w kodzie tyłu. ..

Czy ktoś może wskazać mi właściwy kierunek?

Dzięki

Odpowiedz

21

Zazwyczaj rozwiązanie to nie jest w użyciu konwertera, ale zamiast do animowania koloru pędzla. Jednak do tego trzeba PropertyPath, co z kolei oznacza, że ​​trzeba się storyboard zrobić:

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# składni)

Uwaga ścieżka nieruchomość w zaproszeniu SetTargetProperty, który przechodzi w dół przez Planie właściwość i do wynikowej właściwości Kolor pędzla.

Można również użyć tej techniki do animowania indywidualny gradientu zatrzymuje się pędzlem gradientu itp

+0

To naprawdę eleganckie - spróbuję tego teraz. [EDIT] Błąd: Nie można animować właściwości "Kolor" w "System.Windows.Media.SolidColorBrush", ponieważ obiekt jest zamknięty lub zamrożony. [My code]: \t \t Dim br Jak SolidColorBrush = DirectCast ((PulseLogo.Foreground) SolidColorBrush) \t \t PulseLogo.Foreground.BeginAnimation (SolidColorBrush.ColorProperty, F) „Dzięki za pomoc – Basic

+0

Niestety, człowiek, ja zawiedli. Robiłem to tylko ze scenorysami i naiwnie zakładałem, że mogę to bezpośrednio przetłumaczyć na wywołanie BeginAnimation, co było błędem. Zaktualizowałem odpowiedź, teraz z faktycznym przetestowanym kodem \ * gasp \ * uczciwego-do-dobroci - mam nadzieję, że to działa lepiej. – itowlson

+0

Nie martw się o C# - Są bardzo podobne, to niewiele więcej niż dialekt :) Dzięki za zaktualizowane rozwiązanie - działa bezbłędnie. – 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 są klasą Color Okres jest Klasa TimeSpan, BackGroundCellGrid jest klasa siatki ;

// nie ma potrzeby tworzenia SolidColorBrush i wiązania z nim w XAML; // baw się dobrze!