WPF Fade Animation

后端 未结 7 1331
余生分开走
余生分开走 2020-11-30 00:16

How would I make a control fade in/out when it becomes Visible.

Below is my failed attempt:



        
7条回答
  •  一向
    一向 (楼主)
    2020-11-30 00:59

    I've been coming at this a slightly different way - I've got an extended version of Ray's answer to this question which adds a FadeIn() and FadeOut() extension method to everything that collapses or shows the element as appropriate, then instead of making objects visible I can just call FadeIn() and FadeOut() on them - and it will work an any element without any specific animation code.

        public static T FadeFromTo(this UIElement uiElement, double fromOpacity,
            double toOpacity, int durationInMilliseconds, bool loopAnimation,
            bool showOnStart, bool collapseOnFinish)
        {
            var timeSpan = TimeSpan.FromMilliseconds(durationInMilliseconds);
            var doubleAnimation =
                  new DoubleAnimation(fromOpacity, toOpacity,
                                      new Duration(timeSpan));
                if (loopAnimation)
                    doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
                uiElement.BeginAnimation(UIElement.OpacityProperty, doubleAnimation);
                if (showOnStart)
                {
                    uiElement.ApplyAnimationClock(UIElement.VisibilityProperty, null);
                    uiElement.Visibility = Visibility.Visible;
                }
                if (collapseOnFinish)
                {
                    var keyAnimation = new ObjectAnimationUsingKeyFrames{Duration = new Duration(timeSpan) };
                    keyAnimation.KeyFrames.Add(new DiscreteObjectKeyFrame(Visibility.Collapsed, KeyTime.FromTimeSpan(timeSpan)));
                    uiElement.BeginAnimation(UIElement.VisibilityProperty, keyAnimation);
                }
                return uiElement;
        }
    
        public static T FadeIn(this UIElement uiElement, int durationInMilliseconds)
        {
            return uiElement.FadeFromTo(0, 1, durationInMilliseconds, false, true, false);
        }
    
        public static T FadeOut(this UIElement uiElement, int durationInMilliseconds)
        {
            return uiElement.FadeFromTo(1, 0, durationInMilliseconds, false, false, true);
        }
    

提交回复
热议问题