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

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

14 голосов
/ 12 февраля 2010

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

Моя лучшая попытка на данный момент:

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, а тип свойства для переднего плана - 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 - и я хотел бы сделать это в коде позади ...

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

Спасибо

Ответы [ 2 ]

22 голосов
/ 12 февраля 2010

Обычное решение этой проблемы - не использовать конвертер, а вместо этого анимировать цвет кисти. Однако для этого вам нужен 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();

(простите, синтаксис C #)

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

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

0 голосов
/ 09 марта 2014
            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; // веселись!

...