动画方法,简化和修复

时间:2015-06-15 00:49:11

标签: c# wpf

上下文

我对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。

1 个答案:

答案 0 :(得分:2)

您的问题与Animation无关。问题是您在比较sender.Type时应该比较sender本身即 使用if (sender is TabItem)代替if (obj is TabItem)

此外,您无需逐一将发件人与TabItemLableWindow等进行比较,它们都是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);
    }