2015-01-08 5 views
0

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

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

ответ

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); 
    .. 
    .... 

} 

UPDATE:

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); 
    } 
} 
+0

Это выбрасывает 'InvalidOperationException' на MouseEnter. 'BorderBrush' не указывает на' 'DeependancyObject'in path' (Border.BorderBrush). (SolidColorBrush.Color)' –

+0

this.BorderBrush = новый SolidColorBrush (origColor.Color); поместите эту строку в конструктор ... –

+0

Это исправляет ошибку, но все равно анимации. –