Цвет фона границы WPF Animate

Я пытаюсь анимировать цвет кисти для фона пользовательского класса, который наследуется от Border. Я пробовал ссылку MSDN здесь:

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.coloranimation.aspx

Это не совсем то, что я ищу, но может привести меня к точке без ошибок, но все равно ничего не анимируется. Проблема с примером в том, что они определяют логику внутри класса, который не является прямоугольником. Я пытаюсь определить изнутри прямоугольника (фактически границы).

Ниже приведен мой код, который я попытался экстраполировать из MSDN для моей ситуации.

public class PrettyButton : System.Windows.Controls.Border
{
    private System.Windows.Media.SolidColorBrush hoverColor = new System.Windows.Media.SolidColorBrush();
    private System.Windows.Media.SolidColorBrush origColor = new System.Windows.Media.SolidColorBrush();
    private System.Windows.Media.Animation.Storyboard story = new System.Windows.Media.Animation.Storyboard();

    public PrettyButton()
    {
        hoverColor.Color = System.Windows.Media.Color.FromArgb(255, 50, 200, 0);
        origColor.Color = System.Windows.Media.Color.FromArgb(0, 0, 0, 0);

        this.MouseEnter += PrettyButton_MouseEnter;
        this.MouseLeave += PrettyButton_MouseLeave;

        //Animate in logic
        System.Windows.Media.Animation.ColorAnimation color = new System.Windows.Media.Animation.ColorAnimation(hoverColor.Color, System.TimeSpan.FromMilliseconds(400));
        System.Windows.Media.Animation.Storyboard.SetTargetProperty(color, new System.Windows.PropertyPath(System.Windows.Media.SolidColorBrush.ColorProperty));

        story.Children.Add(color);            
    }

а ниже в mouseEvent у меня есть

void PrettyButton_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        story.Begin(this);            
    }

К сожалению, я больше не получаю ошибок, поэтому след для меня остыл. Я также уверен, что мог бы найти 10 решений в XAML, но я хотел бы, чтобы этот класс можно было использовать повторно в будущем, и переопределение этой логики не идеально.


person Justin Grahn    schedule 08.01.2015    source источник


Ответы (1)


Вместо System.Windows.Media.SolidColorBrush.ColorProperty попробуйте установить "(Border.Background).(SolidColorBrush.Color)" Путь к свойству.

System.Windows.Media.Animation.Storyboard.SetTargetProperty(color, new System.Windows.PropertyPath("(Border.Background).(SolidColorBrush.Color)"));

Также установите Background в constructor PrettyButton следующим образом:

public PrettyButton()
{
    .....
    origColor.Color = System.Windows.Media.Color.FromArgb(0, 0, 0, 0);
    this.Background= new SolidColorBrush(origColor.Color);
    ..
    ....

}

ОБНОВЛЕНИЕ:

public class PrettyButton : System.Windows.Controls.Border
{
    private System.Windows.Media.SolidColorBrush hoverColor = new System.Windows.Media.SolidColorBrush();
    private System.Windows.Media.SolidColorBrush origColor = new System.Windows.Media.SolidColorBrush();


    public PrettyButton()
    {
        hoverColor.Color = System.Windows.Media.Color.FromArgb(255, 50, 200, 0);
        origColor.Color = System.Windows.Media.Color.FromArgb(0, 0, 0, 0);

        this.Background= new SolidColorBrush(origColor.Color);
        this.MouseEnter += PrettyButton_MouseEnter;
        this.MouseLeave += PrettyButton_MouseLeave;

    }

    private void PrettyButton_MouseLeave(object sender, MouseEventArgs e)
    {
        System.Windows.Media.Animation.Storyboard story = new System.Windows.Media.Animation.Storyboard();
        System.Windows.Media.Animation.ColorAnimation color = new System.Windows.Media.Animation.ColorAnimation(origColor.Color, System.TimeSpan.FromMilliseconds(400));
        System.Windows.Media.Animation.Storyboard.SetTargetProperty(color, new System.Windows.PropertyPath("(Border.Background).(SolidColorBrush.Color)"));

        story.Children.Add(color);
        story.Begin(this);
    }

    private void PrettyButton_MouseEnter(object sender, MouseEventArgs e)
    {
        System.Windows.Media.Animation.Storyboard story = new System.Windows.Media.Animation.Storyboard();
        System.Windows.Media.Animation.ColorAnimation color = new System.Windows.Media.Animation.ColorAnimation(hoverColor.Color, System.TimeSpan.FromMilliseconds(400));
        System.Windows.Media.Animation.Storyboard.SetTargetProperty(color, new System.Windows.PropertyPath("(Border.Background).(SolidColorBrush.Color)"));

        story.Children.Add(color);
        story.Begin(this);
    }
}
person Amol Bavannavar    schedule 08.01.2015
comment
Это выдает InvalidOperationException на mouseEnter. BorderBrush не указывает на DeependancyObjectв пути (Border.BorderBrush).(SolidColorBrush.Color) - person Justin Grahn; 08.01.2015
comment
this.BorderBrush = new SolidColorBrush(origColor.Color); поместите эту строку в конструктор... - person Amol Bavannavar; 08.01.2015
comment
Анимации по-прежнему нет. Спасибо за всю помощь, кстати. - person Justin Grahn; 08.01.2015
comment
@JustinGrahn, но он абсолютно работает на моей машине. Не могли бы вы опубликовать, где вы используете этот PrettyButton ?? - person Amol Bavannavar; 08.01.2015
comment
Я тестировал в примере приложения. Я только что добавил тест PrettyButton на пустой белый фон, чтобы увидеть, изменилось ли что-то, чего я не замечал. Ваше решение меняет цвет границы, но не цвет фона, что мне и нужно изменить. Я хотел бы, чтобы граница была невидимой. Это меняет цвет фона для вас? - person Justin Grahn; 08.01.2015
comment
Ооо.. Я думал, вам нужна анимация на BorderBrush.. Все в порядке, просто измените BorderBrush на Background.. Проверьте измененный ответ... - person Amol Bavannavar; 08.01.2015
comment
Ха! Спасибо большое. На самом деле я пробовал это самостоятельно, но не добавил this.Background в конструктор, поэтому он выдавал ошибку. Могу я спросить, где я могу узнать больше о значении PropertyPath, которое вы заменили на мою операцию? Это похоже на волшебство (а это значит, что мне нужно больше узнать об этом). - person Justin Grahn; 08.01.2015
comment
Попробуйте поискать в Google... msdn .microsoft.com/en-us/library/ - person Amol Bavannavar; 08.01.2015