public static void ColorAnimation(FrameworkElement Obj, string From, string To, int Milliseconds)
{
Color from = ( Color )ColorConverter.ConvertFromString( From );
Color to = ( Color )ColorConverter.ConvertFromString( To );
{
ColorAnimation animation = new ColorAnimation();
animation.From = from;
animation.To = to;
animation.Duration = new Duration( TimeSpan.FromMilliseconds( Milliseconds ) );
Storyboard.SetTargetProperty( animation, new PropertyPath( "(Grid.Background).(SolidColorBrush.Color)", null ) );
Storyboard storyboard = new Storyboard();
storyboard.Children.Add( animation );
storyboard.Begin( Obj );
}
}
4条答案
按热度按时间ergxz8rk1#
不能,不能在包含在Style或ControlTemplate中的分镜脚本中使用DynamicResource。事实上,也不能使用数据绑定表达式。
这里的情况是,Style或ControlTemplate中的所有内容都必须安全地跨线程使用,计时系统实际上会尝试冻结Style或ControlTemplate以使它们成为线程安全的。但是,如果存在DynamicResource或数据绑定表达式,它就无法冻结它们。
如需更多信息,请参阅:MSDN Link。请查看“在样式中动画”和“在控件模板中动画”部分(此文档页相当长)。
有关解决方法(至少对于我的场景),请参见:是的。
希望这能帮上忙。我掉的头发已经够多了。
科里
9q78igpj2#
在某些情况下,有一种解决方法:
rjjhvcjd3#
虽然你可以在
ControlTemplate
中有DynamicResource
,但你不能在StoryBoard
中有一个。我用
Opacity
(或Visibility
)解决了这个问题。你可以在ControlTemplate
中添加两个元素。每个元素使用一个DynamicResources
,但只有一个是可见的。你可以通过Storyboard
设置每个元素的Visibility
或Opacity
。9q78igpj4#
简单的解决方案是在代码中使用sb
在mouse_leave事件中使用:(或也可在mouse_enter中使用)
如果(你的主题决定因素1)彩色动画(最小化按钮,“#FF333333”,“#00202020”,150);如果(你的主题决定因素2)彩色动画(最小化按钮,“#FF32506E”,“#0032506E”,200);
等等。