private static void DoOpacityTransition( IOpacityParams transitionParams, FrameworkElement target, RoutedEventHandler onLoaded, Visibility?visibility) { var reverse = Transitionz.IsVisibilityHidden(visibility); target.Opacity = reverse ? transitionParams.To : transitionParams.From; if (onLoaded != null && Transitionz.HasFlag(transitionParams.TransitionOn, TransitionOn.Once)) { target.Loaded -= onLoaded; } var a = new DoubleAnimation { From = reverse ? transitionParams.To : transitionParams.From, To = reverse ? transitionParams.From : transitionParams.To, FillBehavior = transitionParams.FillBehavior, BeginTime = TimeSpan.FromMilliseconds(transitionParams.BeginTime), Duration = new Duration(TimeSpan.FromMilliseconds(transitionParams.Duration)), EasingFunction = reverse ? (transitionParams.ReverseEase ?? transitionParams.Ease) : transitionParams.Ease, AutoReverse = transitionParams.AutoReverse, }; // Directly adding RepeatBehavior to constructor breaks existing animations, so only add it if properly defined if (transitionParams.RepeatBehavior == RepeatBehavior.Forever || transitionParams.RepeatBehavior.HasDuration || (transitionParams.RepeatBehavior.HasDuration && transitionParams.RepeatBehavior.Count > 0)) { a.RepeatBehavior = transitionParams.RepeatBehavior; } a.SetDesiredFrameRate(24); var storyboard = new Storyboard(); storyboard.Children.Add(a); Storyboard.SetTarget(a, target); Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty)); a.Completed += (_, __) => { if (visibility.HasValue) { target.Visibility = visibility.Value; } target.Opacity = reverse ? transitionParams.From : transitionParams.To; storyboard.Stop(); }; storyboard.Begin(); }
public static void SetOpacity(UIElement element, IOpacityParams value) { element.SetValue(OpacityProperty, value); }