上下文
我对WPF的动画有点新鲜,但是我已经和一两个图书馆一起玩了,而且我已经#34;我在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,按钮或我想用它的任何其他控件,所以我"升级"我的方法,这是我的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类或反射类更简单的方法呢?
谢谢Stack。
答案 0 :(得分:2)
您的问题与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);
}