C# 无法设置颜色属性的动画,因为对象已密封或冻结

C# 无法设置颜色属性的动画,因为对象已密封或冻结,c#,wpf,coloranimation,C#,Wpf,Coloranimation,我见过其他类似的问题,但它们似乎总是在XAML中这样做,因为这是在事件处理程序中,我需要用c#找出答案。基本上我只需要发送菜单项闪烁红色 ColorAnimation ca = new ColorAnimation() { From = Color.FromRgb(0, 0, 0), To = Color.FromRgb(255,0,0), AutoReverse = true, RepeatBehavior = new RepeatBehavior(3),

我见过其他类似的问题,但它们似乎总是在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);

您必须先将可变的
SolidColorBrush
实例分配给元素的
前台
属性,然后才能在XAML或代码隐藏中对其设置动画:

var item = (MenuItem)sender;
item.Foreground = new SolidColorBrush(Colors.Black);
item.Foreground.BeginAnimation(SolidColorBrush.ColorProperty, ca);
如果从当前颜色值(例如,此处为
Black
)设置动画,则不必设置动画的
from
属性



还请注意,在未检查结果是否为
null
的情况下,不应将
用作
运算符。最好使用显式类型转换,而不是
as
,因为如果
发送方
不是
菜单项
,您将正确地得到一个
InvalidCastException
而不是
NullReferenceException

as,因为事件处理程序仅从菜单项调用,而不用于任何其他用途。但是你的答案是,在制作动画之前,我必须再次明确地设置颜色,这是完美的,为什么呢?当然,在第一次制作动画之前,只需设置一次背景就足够了。您可能会在XAML中这样做。但是,重要的是不要使用预定义的画笔,如
画笔.Black
,因为这些画笔是不可变的。啊,奇怪,但我想是有道理的。