2016-11-01 3 views
2

Ive видел другие похожие проблемы, но они, похоже, делают это в XAML, так как это в обработчике событий, мне нужно выяснить ответ в C#. в основном мне просто нужно отправить пункт меню, чтобы мигать красным.Невозможно анимировать свойство цвета, поскольку объект запечатан или заморожен

ColorAnimation ca = new ColorAnimation() 
{ 
    From = Color.FromRgb(0, 0, 0), 
    To = Color.FromRgb(255,0,0), 
    AutoReverse = true, 
    RepeatBehavior = new RepeatBehavior(3), 
    Duration=new Duration(TimeSpan.FromSeconds(.5)) 
}; 
(sender as MenuItem).Foreground.BeginAnimation(SolidColorBrush.ColorProperty, ca); 

ответ

3

Вы должны назначить изменяемый SolidColorBrush экземпляр для Foreground собственности элемента, прежде чем он может быть анимированным, либо в XAML или в коде позади:

var item = (MenuItem)sender; 
item.Foreground = new SolidColorBrush(Colors.Black); 
item.Foreground.BeginAnimation(SolidColorBrush.ColorProperty, ca); 

Если вы анимировать от текущего значения цвета (например, Black здесь), вам не нужно устанавливать свойство анимации From.


Заметим также, что вы не должны использовать оператор as без проверки, является ли результат null. Лучше использовать явный тип cast вместо as, потому что в случае, если sender не является MenuItem, вы должны правильно получить InvalidCastException вместо NullReferenceException.

+0

Как не забота обо мне, так как обработчик событий вызывается только из пункта меню и не используется повторно ни для чего другого. Но ваш ответ, где я должен явно установить цвет AGAIN перед анимацией, работал отлично, любое объяснение, почему? – Wobbles

+0

Конечно, достаточно установить фон один раз перед его анимированием в первый раз. Возможно, вы можете сделать это в XAML. Однако важно не использовать одну из предопределенных кистей, таких как «Brushes.Black», потому что они не изменяемы. – Clemens

+0

ahh, странно, но имеет смысл, я думаю. – Wobbles

Смежные вопросы