WPF ColorAnimation для свойства Brush

Интересно, может ли кто-нибудь помочь мне? У меня есть ярлык, который мне нужно, чтобы перекрестие между любыми 2 цветами, когда метод вызывается в коде позади.

Моя лучшая попытка:

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

Проблема заключается в том, что ColorAnimation возвращает Media.Color и тип свойства Foreground - Brush.

Я знаю, как создать соответствующую кисть, но не как сделать это в анимации.

Из Google, похоже, мне нужен конвертер:

<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

но все примеры, которые я видел, привязывают его к анимации в XAML - И я хотел бы сделать это в коде позади...

Кто-нибудь может указать мне в правильном направлении?

Спасибо

Ответ 1

Обычным решением для этого является не использование конвертера, а вместо этого для анимации цвета кисти. Однако для этого вам понадобится PropertyPath, который, в свою очередь, означает, что вам нужна раскадровка:

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 С# синтаксис)

Обратите внимание на путь свойства в вызове SetTargetProperty, который проходит через свойство Foreground и в полученное свойство Color brush.

Вы также можете использовать этот метод для анимации отдельных градиентных остановок в кисти градиента и т.д.

Ответ 2

            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 - это класс Color, timeSpan - это класс TimeSpan, BackGroundCellGrid - класс Grid;

//не нужно создавать SolidColorBrush и привязывать к нему в XAML; // получайте удовольствие!