动画方法,简化和修复

本文关键字:方法 动画 | 更新日期: 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)

而且,没有必要将发送者与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);
    }