private static void DoBlurTansition(
            IBlurParams blurParams,
            FrameworkElement target,
            RoutedEventHandler onLoaded,
            Visibility?visibility)
        {
            var reverse    = Transitionz.IsVisibilityHidden(visibility);
            var blurEffect = new BlurEffect()
            {
                Radius = reverse ? blurParams.To : blurParams.From
            };

            target.Effect = blurEffect;

            if (onLoaded != null && Transitionz.HasFlag(blurParams.TransitionOn, TransitionOn.Once))
            {
                target.Loaded -= onLoaded;
            }

            var a = new DoubleAnimation
            {
                From           = reverse ? blurParams.To : blurParams.From,
                To             = reverse ? blurParams.From : blurParams.To,
                FillBehavior   = blurParams.FillBehavior,
                BeginTime      = TimeSpan.FromMilliseconds(blurParams.BeginTime),
                Duration       = new Duration(TimeSpan.FromMilliseconds(blurParams.Duration)),
                EasingFunction = reverse ? (blurParams.ReverseEase ?? blurParams.Ease) : blurParams.Ease,
                AutoReverse    = blurParams.AutoReverse,
            };

            // Directly adding RepeatBehavior to constructor breaks existing animations, so only add it if properly defined
            if (blurParams.RepeatBehavior == RepeatBehavior.Forever ||
                blurParams.RepeatBehavior.HasDuration ||
                (blurParams.RepeatBehavior.HasDuration && blurParams.RepeatBehavior.Count > 0))
            {
                a.RepeatBehavior = blurParams.RepeatBehavior;
            }

            if (blurParams.To == 0.0)
            {
                a.Completed += (_, __) => target.Effect = null;
            }

            if (visibility.HasValue)
            {
                a.Completed += (_, __) => target.Visibility = visibility.Value;
            }

            a.SetDesiredFrameRate(24);

            var storyboard = new Storyboard();

            storyboard.Children.Add(a);
            Storyboard.SetTarget(a, ((BlurEffect)target.Effect));
            Storyboard.SetTargetProperty(a, new PropertyPath(BlurEffect.RadiusProperty));
            FreezeHelper.SetFreeze(storyboard, true);
            storyboard.Begin();
        }
 public static void SetBlur(DependencyObject element, IBlurParams value)
 {
     element.SetValue(BlurProperty, value);
 }