动画方法,简化和修复
本文关键字:方法 动画 | 更新日期: 2023-09-27 17:56:16
>上下文
我在制作 WPF 动画方面有点陌生,但是我已经玩过一两个库,并且我"拥有"了一个与 WPF 中的 Window 控件一起使用的动画,这是该方法的示例,请记住此方法有效:
public void AnimateFadeWindow(object sender, double opacity, double period)
{
//Tab item is a enw tab item (the sender is casted to this type.)
Window win = (Window)sender;
win.Opacity = 0;
//using the doubleanimation class, animation is a new isntancem use the parameter opacity and set the period to a timespan.
DoubleAnimation animation = new DoubleAnimation(opacity, TimeSpan.FromSeconds(period));
//begin the animation on the object.
win.BeginAnimation(Window.OpacityProperty, animation);
}
问题
就像我之前说的,这段代码有效,这段代码的问题当然是,它只适用于 Window 控件,它不适用于其他控件,例如 TabItem、Button 或任何其他我想使用它的控件,所以我"升级"了我的方法,这是我的 CURRENT 方法:
public void AnimateFade(object sender, double opacity, double period)
{
//using the doubleanimation class, animation is a new isntancem use the parameter opacity and set the period to a timespan.
DoubleAnimation animation = new DoubleAnimation(opacity, TimeSpan.FromSeconds(period));
Object obj = sender.GetType();
if (obj is TabItem)
{
TabItem tab = (TabItem)sender;
tab.BeginAnimation(TabItem.OpacityProperty, animation);
}
else if (obj is Label)
{
Label lab = (Label)sender;
lab.BeginAnimation(Label.OpacityProperty, animation);
}
else if (obj is Window)
{
Window win = (Window)sender;
win.Opacity = 0;
win.BeginAnimation(Window.OpacityProperty, animation);
}
}
此方法不起作用。我真的不知道我在这里做错了什么,所以我想知道是否有人可以帮忙。
另外,有没有更简单的方法可以使用 PropertyInfo 类或反射类之类的东西来做到这一点?
谢谢堆栈。
您的问题与Animation
无关。问题是你在比较sender.Type
而你应该比较sender
本身,即使用 if (sender is TabItem)
而不是 if (obj is TabItem)
。
而且,没有必要将发送者与TabItem
、Lable
、Window
等逐一比较,它们都是UIElements
的! 由于UIElement
实现了IAnimatable
,你只需要将sender
强制转换为UIElement
并且你有一个将动画应用于任何控件的通用方法:
public void AnimateFade(object sender, double opacity, double period)
{
UIElement element = (UIElement)sender;
element.Opacity = 0;
DoubleAnimation animation = new DoubleAnimation(opacity, TimeSpan.FromSeconds(period));
element.BeginAnimation(UIElement.OpacityProperty, animation);
}