file scoped namespaces (#565)
This commit is contained in:
@@ -8,109 +8,108 @@ using Windows.UI.Composition;
|
||||
using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Media.Animation;
|
||||
|
||||
namespace Wino.Extensions
|
||||
namespace Wino.Extensions;
|
||||
|
||||
public static class AnimationExtensions
|
||||
{
|
||||
public static class AnimationExtensions
|
||||
#region Composition
|
||||
|
||||
public static ScalarKeyFrameAnimation CreateScalarKeyFrameAnimation(this Compositor compositor, float? from, float to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
#region Composition
|
||||
var animation = compositor.CreateScalarKeyFrameAnimation();
|
||||
|
||||
public static ScalarKeyFrameAnimation CreateScalarKeyFrameAnimation(this Compositor compositor, float? from, float to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateScalarKeyFrameAnimation();
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
if (!delay.Equals(0)) animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing);
|
||||
animation.InsertKeyFrame(1.0f, to, easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
if (!delay.Equals(0)) animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing);
|
||||
animation.InsertKeyFrame(1.0f, to, easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public static Vector2KeyFrameAnimation CreateVector2KeyFrameAnimation(this Compositor compositor, Vector2? from, Vector2 to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateVector2KeyFrameAnimation();
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing);
|
||||
animation.InsertKeyFrame(1.0f, to, easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public static Vector3KeyFrameAnimation CreateVector3KeyFrameAnimation(this Compositor compositor, Vector2? from, Vector2 to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateVector3KeyFrameAnimation();
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, new Vector3(from.Value, 1.0f), easing);
|
||||
animation.InsertKeyFrame(1.0f, new Vector3(to, 1.0f), easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public static Vector3KeyFrameAnimation CreateVector3KeyFrameAnimation(this Compositor compositor, Vector3? from, Vector3 to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateVector3KeyFrameAnimation();
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing);
|
||||
animation.InsertKeyFrame(1.0f, to, easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Xaml Storyboard
|
||||
|
||||
public static void Animate(this DependencyObject target, double? from, double to,
|
||||
string propertyPath, int duration = 400, int startTime = 0,
|
||||
EasingFunctionBase easing = null, Action completed = null, bool enableDependentAnimation = false)
|
||||
{
|
||||
if (easing == null)
|
||||
{
|
||||
easing = new ExponentialEase();
|
||||
}
|
||||
|
||||
var db = new DoubleAnimation
|
||||
{
|
||||
EnableDependentAnimation = enableDependentAnimation,
|
||||
To = to,
|
||||
From = from,
|
||||
EasingFunction = easing,
|
||||
Duration = TimeSpan.FromMilliseconds(duration)
|
||||
};
|
||||
Storyboard.SetTarget(db, target);
|
||||
Storyboard.SetTargetProperty(db, propertyPath);
|
||||
|
||||
var sb = new Storyboard
|
||||
{
|
||||
BeginTime = TimeSpan.FromMilliseconds(startTime)
|
||||
};
|
||||
|
||||
if (completed != null)
|
||||
{
|
||||
sb.Completed += (s, e) =>
|
||||
{
|
||||
completed();
|
||||
};
|
||||
}
|
||||
|
||||
sb.Children.Add(db);
|
||||
sb.Begin();
|
||||
}
|
||||
|
||||
#endregion
|
||||
return animation;
|
||||
}
|
||||
|
||||
public static Vector2KeyFrameAnimation CreateVector2KeyFrameAnimation(this Compositor compositor, Vector2? from, Vector2 to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateVector2KeyFrameAnimation();
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing);
|
||||
animation.InsertKeyFrame(1.0f, to, easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public static Vector3KeyFrameAnimation CreateVector3KeyFrameAnimation(this Compositor compositor, Vector2? from, Vector2 to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateVector3KeyFrameAnimation();
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, new Vector3(from.Value, 1.0f), easing);
|
||||
animation.InsertKeyFrame(1.0f, new Vector3(to, 1.0f), easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
public static Vector3KeyFrameAnimation CreateVector3KeyFrameAnimation(this Compositor compositor, Vector3? from, Vector3 to,
|
||||
double duration, double delay, CompositionEasingFunction easing, AnimationIterationBehavior iterationBehavior)
|
||||
{
|
||||
var animation = compositor.CreateVector3KeyFrameAnimation();
|
||||
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
if (from.HasValue) animation.InsertKeyFrame(0.0f, from.Value, easing);
|
||||
animation.InsertKeyFrame(1.0f, to, easing);
|
||||
animation.IterationBehavior = iterationBehavior;
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Xaml Storyboard
|
||||
|
||||
public static void Animate(this DependencyObject target, double? from, double to,
|
||||
string propertyPath, int duration = 400, int startTime = 0,
|
||||
EasingFunctionBase easing = null, Action completed = null, bool enableDependentAnimation = false)
|
||||
{
|
||||
if (easing == null)
|
||||
{
|
||||
easing = new ExponentialEase();
|
||||
}
|
||||
|
||||
var db = new DoubleAnimation
|
||||
{
|
||||
EnableDependentAnimation = enableDependentAnimation,
|
||||
To = to,
|
||||
From = from,
|
||||
EasingFunction = easing,
|
||||
Duration = TimeSpan.FromMilliseconds(duration)
|
||||
};
|
||||
Storyboard.SetTarget(db, target);
|
||||
Storyboard.SetTargetProperty(db, propertyPath);
|
||||
|
||||
var sb = new Storyboard
|
||||
{
|
||||
BeginTime = TimeSpan.FromMilliseconds(startTime)
|
||||
};
|
||||
|
||||
if (completed != null)
|
||||
{
|
||||
sb.Completed += (s, e) =>
|
||||
{
|
||||
completed();
|
||||
};
|
||||
}
|
||||
|
||||
sb.Children.Add(db);
|
||||
sb.Begin();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -4,70 +4,69 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Wino.Extensions
|
||||
namespace Wino.Extensions;
|
||||
|
||||
public enum TransitionDirection
|
||||
{
|
||||
public enum TransitionDirection
|
||||
{
|
||||
TopToBottom,
|
||||
BottomToTop,
|
||||
LeftToRight,
|
||||
RightToLeft
|
||||
}
|
||||
|
||||
public enum ClipAnimationDirection
|
||||
{
|
||||
Top,
|
||||
Bottom,
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
|
||||
public enum AnimationAxis
|
||||
{
|
||||
X,
|
||||
Y,
|
||||
Z
|
||||
}
|
||||
|
||||
public enum AnimationType
|
||||
{
|
||||
KeyFrame,
|
||||
Expression
|
||||
}
|
||||
|
||||
public enum FlickDirection
|
||||
{
|
||||
None,
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
|
||||
public enum ViewState
|
||||
{
|
||||
Empty,
|
||||
Small,
|
||||
Big,
|
||||
Full
|
||||
}
|
||||
|
||||
public enum Gesture
|
||||
{
|
||||
Initial,
|
||||
Tap,
|
||||
Swipe
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum VisualPropertyType
|
||||
{
|
||||
None = 0,
|
||||
Opacity = 1 << 0,
|
||||
Offset = 1 << 1,
|
||||
Scale = 1 << 2,
|
||||
Size = 1 << 3,
|
||||
RotationAngleInDegrees = 1 << 4,
|
||||
All = ~0
|
||||
}
|
||||
TopToBottom,
|
||||
BottomToTop,
|
||||
LeftToRight,
|
||||
RightToLeft
|
||||
}
|
||||
|
||||
public enum ClipAnimationDirection
|
||||
{
|
||||
Top,
|
||||
Bottom,
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
|
||||
public enum AnimationAxis
|
||||
{
|
||||
X,
|
||||
Y,
|
||||
Z
|
||||
}
|
||||
|
||||
public enum AnimationType
|
||||
{
|
||||
KeyFrame,
|
||||
Expression
|
||||
}
|
||||
|
||||
public enum FlickDirection
|
||||
{
|
||||
None,
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
Right
|
||||
}
|
||||
|
||||
public enum ViewState
|
||||
{
|
||||
Empty,
|
||||
Small,
|
||||
Big,
|
||||
Full
|
||||
}
|
||||
|
||||
public enum Gesture
|
||||
{
|
||||
Initial,
|
||||
Tap,
|
||||
Swipe
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum VisualPropertyType
|
||||
{
|
||||
None = 0,
|
||||
Opacity = 1 << 0,
|
||||
Offset = 1 << 1,
|
||||
Scale = 1 << 2,
|
||||
Size = 1 << 3,
|
||||
RotationAngleInDegrees = 1 << 4,
|
||||
All = ~0
|
||||
}
|
||||
|
||||
@@ -8,193 +8,192 @@ using Windows.UI.Composition;
|
||||
using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Hosting;
|
||||
|
||||
namespace Wino.Extensions
|
||||
namespace Wino.Extensions;
|
||||
|
||||
public static partial class CompositionExtensions
|
||||
{
|
||||
public static partial class CompositionExtensions
|
||||
public static void EnableFluidVisibilityAnimation(this UIElement element, AnimationAxis? axis = null,
|
||||
float showFromOffset = 0.0f, float hideToOffset = 0.0f, Vector3? centerPoint = null,
|
||||
float showFromScale = 1.0f, float hideToScale = 1.0f, float showDuration = 800.0f, float hideDuration = 800.0f,
|
||||
int showDelay = 0, int hideDelay = 0, bool animateOpacity = true)
|
||||
{
|
||||
public static void EnableFluidVisibilityAnimation(this UIElement element, AnimationAxis? axis = null,
|
||||
float showFromOffset = 0.0f, float hideToOffset = 0.0f, Vector3? centerPoint = null,
|
||||
float showFromScale = 1.0f, float hideToScale = 1.0f, float showDuration = 800.0f, float hideDuration = 800.0f,
|
||||
int showDelay = 0, int hideDelay = 0, bool animateOpacity = true)
|
||||
var elementVisual = element.Visual();
|
||||
var compositor = elementVisual.Compositor;
|
||||
ElementCompositionPreview.SetIsTranslationEnabled(element, true);
|
||||
|
||||
ScalarKeyFrameAnimation hideOpacityAnimation = null;
|
||||
ScalarKeyFrameAnimation showOpacityAnimation = null;
|
||||
ScalarKeyFrameAnimation hideOffsetAnimation = null;
|
||||
ScalarKeyFrameAnimation showOffsetAnimation = null;
|
||||
Vector2KeyFrameAnimation hideScaleAnimation = null;
|
||||
Vector2KeyFrameAnimation showeScaleAnimation = null;
|
||||
|
||||
if (animateOpacity)
|
||||
{
|
||||
var elementVisual = element.Visual();
|
||||
var compositor = elementVisual.Compositor;
|
||||
ElementCompositionPreview.SetIsTranslationEnabled(element, true);
|
||||
|
||||
ScalarKeyFrameAnimation hideOpacityAnimation = null;
|
||||
ScalarKeyFrameAnimation showOpacityAnimation = null;
|
||||
ScalarKeyFrameAnimation hideOffsetAnimation = null;
|
||||
ScalarKeyFrameAnimation showOffsetAnimation = null;
|
||||
Vector2KeyFrameAnimation hideScaleAnimation = null;
|
||||
Vector2KeyFrameAnimation showeScaleAnimation = null;
|
||||
|
||||
if (animateOpacity)
|
||||
{
|
||||
hideOpacityAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
hideOpacityAnimation.InsertKeyFrame(1.0f, 0.0f);
|
||||
hideOpacityAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration);
|
||||
hideOpacityAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay);
|
||||
hideOpacityAnimation.Target = "Opacity";
|
||||
}
|
||||
|
||||
if (!hideToOffset.Equals(0.0f))
|
||||
{
|
||||
hideOffsetAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
hideOffsetAnimation.InsertKeyFrame(1.0f, hideToOffset);
|
||||
hideOffsetAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration);
|
||||
hideOffsetAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay);
|
||||
hideOffsetAnimation.Target = $"Translation.{axis}";
|
||||
}
|
||||
|
||||
if (centerPoint.HasValue)
|
||||
{
|
||||
elementVisual.CenterPoint = centerPoint.Value;
|
||||
}
|
||||
|
||||
if (!hideToScale.Equals(1.0f))
|
||||
{
|
||||
hideScaleAnimation = compositor.CreateVector2KeyFrameAnimation();
|
||||
hideScaleAnimation.InsertKeyFrame(1.0f, new Vector2(hideToScale));
|
||||
hideScaleAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration);
|
||||
hideScaleAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay);
|
||||
hideScaleAnimation.Target = "Scale.XY";
|
||||
}
|
||||
|
||||
var hideAnimationGroup = compositor.CreateAnimationGroup();
|
||||
if (hideOpacityAnimation != null)
|
||||
{
|
||||
hideAnimationGroup.Add(hideOpacityAnimation);
|
||||
}
|
||||
if (hideOffsetAnimation != null)
|
||||
{
|
||||
hideAnimationGroup.Add(hideOffsetAnimation);
|
||||
}
|
||||
if (hideScaleAnimation != null)
|
||||
{
|
||||
hideAnimationGroup.Add(hideScaleAnimation);
|
||||
}
|
||||
|
||||
ElementCompositionPreview.SetImplicitHideAnimation(element, hideAnimationGroup);
|
||||
|
||||
if (animateOpacity)
|
||||
{
|
||||
showOpacityAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
showOpacityAnimation.InsertKeyFrame(1.0f, 1.0f);
|
||||
showOpacityAnimation.Duration = TimeSpan.FromMilliseconds(showDuration);
|
||||
showOpacityAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay);
|
||||
showOpacityAnimation.Target = "Opacity";
|
||||
}
|
||||
|
||||
if (!showFromOffset.Equals(0.0f))
|
||||
{
|
||||
showOffsetAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
showOffsetAnimation.InsertKeyFrame(0.0f, showFromOffset);
|
||||
showOffsetAnimation.InsertKeyFrame(1.0f, 0.0f);
|
||||
showOffsetAnimation.Duration = TimeSpan.FromMilliseconds(showDuration);
|
||||
showOffsetAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay);
|
||||
showOffsetAnimation.Target = $"Translation.{axis}";
|
||||
}
|
||||
|
||||
if (!showFromScale.Equals(1.0f))
|
||||
{
|
||||
showeScaleAnimation = compositor.CreateVector2KeyFrameAnimation();
|
||||
showeScaleAnimation.InsertKeyFrame(0.0f, new Vector2(showFromScale));
|
||||
showeScaleAnimation.InsertKeyFrame(1.0f, Vector2.One);
|
||||
showeScaleAnimation.Duration = TimeSpan.FromMilliseconds(showDuration);
|
||||
showeScaleAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay);
|
||||
showeScaleAnimation.Target = "Scale.XY";
|
||||
}
|
||||
|
||||
var showAnimationGroup = compositor.CreateAnimationGroup();
|
||||
if (showOpacityAnimation != null)
|
||||
{
|
||||
showAnimationGroup.Add(showOpacityAnimation);
|
||||
}
|
||||
if (showOffsetAnimation != null)
|
||||
{
|
||||
showAnimationGroup.Add(showOffsetAnimation);
|
||||
}
|
||||
if (showeScaleAnimation != null)
|
||||
{
|
||||
showAnimationGroup.Add(showeScaleAnimation);
|
||||
}
|
||||
|
||||
ElementCompositionPreview.SetImplicitShowAnimation(element, showAnimationGroup);
|
||||
hideOpacityAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
hideOpacityAnimation.InsertKeyFrame(1.0f, 0.0f);
|
||||
hideOpacityAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration);
|
||||
hideOpacityAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay);
|
||||
hideOpacityAnimation.Target = "Opacity";
|
||||
}
|
||||
|
||||
public static void EnableImplicitAnimation(this UIElement element, VisualPropertyType typeToAnimate,
|
||||
double duration = 800, double delay = 0, CompositionEasingFunction easing = null)
|
||||
if (!hideToOffset.Equals(0.0f))
|
||||
{
|
||||
var visual = element.Visual();
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var animationCollection = compositor.CreateImplicitAnimationCollection();
|
||||
|
||||
foreach (var type in UtilExtensions.GetValues<VisualPropertyType>())
|
||||
{
|
||||
if (!typeToAnimate.HasFlag(type)) continue;
|
||||
|
||||
var animation = CreateAnimationByType(compositor, type, duration, delay, easing);
|
||||
|
||||
if (animation != null)
|
||||
{
|
||||
animationCollection[type.ToString()] = animation;
|
||||
}
|
||||
}
|
||||
|
||||
visual.ImplicitAnimations = animationCollection;
|
||||
hideOffsetAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
hideOffsetAnimation.InsertKeyFrame(1.0f, hideToOffset);
|
||||
hideOffsetAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration);
|
||||
hideOffsetAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay);
|
||||
hideOffsetAnimation.Target = $"Translation.{axis}";
|
||||
}
|
||||
|
||||
public static void EnableImplicitAnimation(this Visual visual, VisualPropertyType typeToAnimate,
|
||||
double duration = 800, double delay = 0, CompositionEasingFunction easing = null)
|
||||
if (centerPoint.HasValue)
|
||||
{
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var animationCollection = compositor.CreateImplicitAnimationCollection();
|
||||
|
||||
foreach (var type in UtilExtensions.GetValues<VisualPropertyType>())
|
||||
{
|
||||
if (!typeToAnimate.HasFlag(type)) continue;
|
||||
|
||||
var animation = CreateAnimationByType(compositor, type, duration, delay, easing);
|
||||
|
||||
if (animation != null)
|
||||
{
|
||||
animationCollection[type.ToString()] = animation;
|
||||
}
|
||||
}
|
||||
|
||||
visual.ImplicitAnimations = animationCollection;
|
||||
elementVisual.CenterPoint = centerPoint.Value;
|
||||
}
|
||||
|
||||
private static KeyFrameAnimation CreateAnimationByType(Compositor compositor, VisualPropertyType type,
|
||||
double duration = 800, double delay = 0, CompositionEasingFunction easing = null)
|
||||
if (!hideToScale.Equals(1.0f))
|
||||
{
|
||||
KeyFrameAnimation animation;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case VisualPropertyType.Offset:
|
||||
case VisualPropertyType.Scale:
|
||||
animation = compositor.CreateVector3KeyFrameAnimation();
|
||||
break;
|
||||
case VisualPropertyType.Size:
|
||||
animation = compositor.CreateVector2KeyFrameAnimation();
|
||||
break;
|
||||
case VisualPropertyType.Opacity:
|
||||
case VisualPropertyType.RotationAngleInDegrees:
|
||||
animation = compositor.CreateScalarKeyFrameAnimation();
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
animation.InsertExpressionKeyFrame(1.0f, "this.FinalValue", easing);
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
animation.Target = type.ToString();
|
||||
|
||||
return animation;
|
||||
hideScaleAnimation = compositor.CreateVector2KeyFrameAnimation();
|
||||
hideScaleAnimation.InsertKeyFrame(1.0f, new Vector2(hideToScale));
|
||||
hideScaleAnimation.Duration = TimeSpan.FromMilliseconds(hideDuration);
|
||||
hideScaleAnimation.DelayTime = TimeSpan.FromMilliseconds(hideDelay);
|
||||
hideScaleAnimation.Target = "Scale.XY";
|
||||
}
|
||||
|
||||
var hideAnimationGroup = compositor.CreateAnimationGroup();
|
||||
if (hideOpacityAnimation != null)
|
||||
{
|
||||
hideAnimationGroup.Add(hideOpacityAnimation);
|
||||
}
|
||||
if (hideOffsetAnimation != null)
|
||||
{
|
||||
hideAnimationGroup.Add(hideOffsetAnimation);
|
||||
}
|
||||
if (hideScaleAnimation != null)
|
||||
{
|
||||
hideAnimationGroup.Add(hideScaleAnimation);
|
||||
}
|
||||
|
||||
ElementCompositionPreview.SetImplicitHideAnimation(element, hideAnimationGroup);
|
||||
|
||||
if (animateOpacity)
|
||||
{
|
||||
showOpacityAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
showOpacityAnimation.InsertKeyFrame(1.0f, 1.0f);
|
||||
showOpacityAnimation.Duration = TimeSpan.FromMilliseconds(showDuration);
|
||||
showOpacityAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay);
|
||||
showOpacityAnimation.Target = "Opacity";
|
||||
}
|
||||
|
||||
if (!showFromOffset.Equals(0.0f))
|
||||
{
|
||||
showOffsetAnimation = compositor.CreateScalarKeyFrameAnimation();
|
||||
showOffsetAnimation.InsertKeyFrame(0.0f, showFromOffset);
|
||||
showOffsetAnimation.InsertKeyFrame(1.0f, 0.0f);
|
||||
showOffsetAnimation.Duration = TimeSpan.FromMilliseconds(showDuration);
|
||||
showOffsetAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay);
|
||||
showOffsetAnimation.Target = $"Translation.{axis}";
|
||||
}
|
||||
|
||||
if (!showFromScale.Equals(1.0f))
|
||||
{
|
||||
showeScaleAnimation = compositor.CreateVector2KeyFrameAnimation();
|
||||
showeScaleAnimation.InsertKeyFrame(0.0f, new Vector2(showFromScale));
|
||||
showeScaleAnimation.InsertKeyFrame(1.0f, Vector2.One);
|
||||
showeScaleAnimation.Duration = TimeSpan.FromMilliseconds(showDuration);
|
||||
showeScaleAnimation.DelayTime = TimeSpan.FromMilliseconds(showDelay);
|
||||
showeScaleAnimation.Target = "Scale.XY";
|
||||
}
|
||||
|
||||
var showAnimationGroup = compositor.CreateAnimationGroup();
|
||||
if (showOpacityAnimation != null)
|
||||
{
|
||||
showAnimationGroup.Add(showOpacityAnimation);
|
||||
}
|
||||
if (showOffsetAnimation != null)
|
||||
{
|
||||
showAnimationGroup.Add(showOffsetAnimation);
|
||||
}
|
||||
if (showeScaleAnimation != null)
|
||||
{
|
||||
showAnimationGroup.Add(showeScaleAnimation);
|
||||
}
|
||||
|
||||
ElementCompositionPreview.SetImplicitShowAnimation(element, showAnimationGroup);
|
||||
}
|
||||
|
||||
public static void EnableImplicitAnimation(this UIElement element, VisualPropertyType typeToAnimate,
|
||||
double duration = 800, double delay = 0, CompositionEasingFunction easing = null)
|
||||
{
|
||||
var visual = element.Visual();
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var animationCollection = compositor.CreateImplicitAnimationCollection();
|
||||
|
||||
foreach (var type in UtilExtensions.GetValues<VisualPropertyType>())
|
||||
{
|
||||
if (!typeToAnimate.HasFlag(type)) continue;
|
||||
|
||||
var animation = CreateAnimationByType(compositor, type, duration, delay, easing);
|
||||
|
||||
if (animation != null)
|
||||
{
|
||||
animationCollection[type.ToString()] = animation;
|
||||
}
|
||||
}
|
||||
|
||||
visual.ImplicitAnimations = animationCollection;
|
||||
}
|
||||
|
||||
public static void EnableImplicitAnimation(this Visual visual, VisualPropertyType typeToAnimate,
|
||||
double duration = 800, double delay = 0, CompositionEasingFunction easing = null)
|
||||
{
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var animationCollection = compositor.CreateImplicitAnimationCollection();
|
||||
|
||||
foreach (var type in UtilExtensions.GetValues<VisualPropertyType>())
|
||||
{
|
||||
if (!typeToAnimate.HasFlag(type)) continue;
|
||||
|
||||
var animation = CreateAnimationByType(compositor, type, duration, delay, easing);
|
||||
|
||||
if (animation != null)
|
||||
{
|
||||
animationCollection[type.ToString()] = animation;
|
||||
}
|
||||
}
|
||||
|
||||
visual.ImplicitAnimations = animationCollection;
|
||||
}
|
||||
|
||||
private static KeyFrameAnimation CreateAnimationByType(Compositor compositor, VisualPropertyType type,
|
||||
double duration = 800, double delay = 0, CompositionEasingFunction easing = null)
|
||||
{
|
||||
KeyFrameAnimation animation;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case VisualPropertyType.Offset:
|
||||
case VisualPropertyType.Scale:
|
||||
animation = compositor.CreateVector3KeyFrameAnimation();
|
||||
break;
|
||||
case VisualPropertyType.Size:
|
||||
animation = compositor.CreateVector2KeyFrameAnimation();
|
||||
break;
|
||||
case VisualPropertyType.Opacity:
|
||||
case VisualPropertyType.RotationAngleInDegrees:
|
||||
animation = compositor.CreateScalarKeyFrameAnimation();
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
animation.InsertExpressionKeyFrame(1.0f, "this.FinalValue", easing);
|
||||
animation.Duration = TimeSpan.FromMilliseconds(duration);
|
||||
animation.DelayTime = TimeSpan.FromMilliseconds(delay);
|
||||
animation.Target = type.ToString();
|
||||
|
||||
return animation;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,124 +4,123 @@ using System.Threading.Tasks;
|
||||
using Windows.UI.Composition;
|
||||
using Windows.UI.Xaml;
|
||||
|
||||
namespace Wino.Extensions
|
||||
namespace Wino.Extensions;
|
||||
|
||||
public static partial class CompositionExtensions
|
||||
{
|
||||
public static partial class CompositionExtensions
|
||||
public static void StartSizeAnimation(this UIElement element, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
{
|
||||
public static void StartSizeAnimation(this UIElement element, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
CompositionScopedBatch batch = null;
|
||||
|
||||
var visual = element.Visual();
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
if (completed != null)
|
||||
{
|
||||
CompositionScopedBatch batch = null;
|
||||
|
||||
var visual = element.Visual();
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
if (completed != null)
|
||||
{
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += (s, e) => completed();
|
||||
}
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch?.End();
|
||||
}
|
||||
|
||||
public static void StartSizeAnimation(this Visual visual, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
{
|
||||
CompositionScopedBatch batch = null;
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
if (completed != null)
|
||||
{
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += (s, e) => completed();
|
||||
}
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch?.End();
|
||||
}
|
||||
|
||||
public static Task StartSizeAnimationAsync(this UIElement element, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
{
|
||||
CompositionScopedBatch batch;
|
||||
|
||||
var visual = element.Visual();
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var taskSource = new TaskCompletionSource<bool>();
|
||||
|
||||
void Completed(object o, CompositionBatchCompletedEventArgs e)
|
||||
{
|
||||
batch.Completed -= Completed;
|
||||
taskSource.SetResult(true);
|
||||
}
|
||||
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += Completed;
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch.End();
|
||||
|
||||
return taskSource.Task;
|
||||
batch.Completed += (s, e) => completed();
|
||||
}
|
||||
|
||||
public static Task StartSizeAnimationAsync(this Visual visual, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
if (to == null)
|
||||
{
|
||||
CompositionScopedBatch batch;
|
||||
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var taskSource = new TaskCompletionSource<bool>();
|
||||
|
||||
void Completed(object o, CompositionBatchCompletedEventArgs e)
|
||||
{
|
||||
batch.Completed -= Completed;
|
||||
taskSource.SetResult(true);
|
||||
}
|
||||
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += Completed;
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch.End();
|
||||
|
||||
return taskSource.Task;
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch?.End();
|
||||
}
|
||||
|
||||
public static void StartSizeAnimation(this Visual visual, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
{
|
||||
CompositionScopedBatch batch = null;
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
if (completed != null)
|
||||
{
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += (s, e) => completed();
|
||||
}
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch?.End();
|
||||
}
|
||||
|
||||
public static Task StartSizeAnimationAsync(this UIElement element, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
{
|
||||
CompositionScopedBatch batch;
|
||||
|
||||
var visual = element.Visual();
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var taskSource = new TaskCompletionSource<bool>();
|
||||
|
||||
void Completed(object o, CompositionBatchCompletedEventArgs e)
|
||||
{
|
||||
batch.Completed -= Completed;
|
||||
taskSource.SetResult(true);
|
||||
}
|
||||
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += Completed;
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch.End();
|
||||
|
||||
return taskSource.Task;
|
||||
}
|
||||
|
||||
public static Task StartSizeAnimationAsync(this Visual visual, Vector2? from = null, Vector2? to = null,
|
||||
double duration = 800, int delay = 0, CompositionEasingFunction easing = null,
|
||||
AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count)
|
||||
{
|
||||
CompositionScopedBatch batch;
|
||||
|
||||
var compositor = visual.Compositor;
|
||||
|
||||
var taskSource = new TaskCompletionSource<bool>();
|
||||
|
||||
void Completed(object o, CompositionBatchCompletedEventArgs e)
|
||||
{
|
||||
batch.Completed -= Completed;
|
||||
taskSource.SetResult(true);
|
||||
}
|
||||
|
||||
batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
|
||||
batch.Completed += Completed;
|
||||
|
||||
if (to == null)
|
||||
{
|
||||
to = Vector2.One;
|
||||
}
|
||||
|
||||
visual.StartAnimation("Size",
|
||||
compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior));
|
||||
|
||||
batch.End();
|
||||
|
||||
return taskSource.Task;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,34 +1,33 @@
|
||||
using Windows.UI.Xaml;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.UWP.Extensions
|
||||
namespace Wino.Core.UWP.Extensions;
|
||||
|
||||
public static class ElementThemeExtensions
|
||||
{
|
||||
public static class ElementThemeExtensions
|
||||
public static ApplicationElementTheme ToWinoElementTheme(this ElementTheme elementTheme)
|
||||
{
|
||||
public static ApplicationElementTheme ToWinoElementTheme(this ElementTheme elementTheme)
|
||||
switch (elementTheme)
|
||||
{
|
||||
switch (elementTheme)
|
||||
{
|
||||
case ElementTheme.Light:
|
||||
return ApplicationElementTheme.Light;
|
||||
case ElementTheme.Dark:
|
||||
return ApplicationElementTheme.Dark;
|
||||
}
|
||||
|
||||
return ApplicationElementTheme.Default;
|
||||
case ElementTheme.Light:
|
||||
return ApplicationElementTheme.Light;
|
||||
case ElementTheme.Dark:
|
||||
return ApplicationElementTheme.Dark;
|
||||
}
|
||||
|
||||
public static ElementTheme ToWindowsElementTheme(this ApplicationElementTheme elementTheme)
|
||||
{
|
||||
switch (elementTheme)
|
||||
{
|
||||
case ApplicationElementTheme.Light:
|
||||
return ElementTheme.Light;
|
||||
case ApplicationElementTheme.Dark:
|
||||
return ElementTheme.Dark;
|
||||
}
|
||||
return ApplicationElementTheme.Default;
|
||||
}
|
||||
|
||||
return ElementTheme.Default;
|
||||
public static ElementTheme ToWindowsElementTheme(this ApplicationElementTheme elementTheme)
|
||||
{
|
||||
switch (elementTheme)
|
||||
{
|
||||
case ApplicationElementTheme.Light:
|
||||
return ElementTheme.Light;
|
||||
case ApplicationElementTheme.Dark:
|
||||
return ElementTheme.Dark;
|
||||
}
|
||||
|
||||
return ElementTheme.Default;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,24 @@
|
||||
using Windows.ApplicationModel;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.UWP.Extensions
|
||||
namespace Wino.Core.UWP.Extensions;
|
||||
|
||||
public static class StartupTaskStateExtensions
|
||||
{
|
||||
public static class StartupTaskStateExtensions
|
||||
public static StartupBehaviorResult AsStartupBehaviorResult(this StartupTaskState state)
|
||||
{
|
||||
public static StartupBehaviorResult AsStartupBehaviorResult(this StartupTaskState state)
|
||||
switch (state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case StartupTaskState.Disabled:
|
||||
case StartupTaskState.DisabledByPolicy:
|
||||
return StartupBehaviorResult.Disabled;
|
||||
case StartupTaskState.DisabledByUser:
|
||||
return StartupBehaviorResult.DisabledByUser;
|
||||
case StartupTaskState.Enabled:
|
||||
case StartupTaskState.EnabledByPolicy:
|
||||
return StartupBehaviorResult.Enabled;
|
||||
default:
|
||||
return StartupBehaviorResult.Fatal;
|
||||
}
|
||||
case StartupTaskState.Disabled:
|
||||
case StartupTaskState.DisabledByPolicy:
|
||||
return StartupBehaviorResult.Disabled;
|
||||
case StartupTaskState.DisabledByUser:
|
||||
return StartupBehaviorResult.DisabledByUser;
|
||||
case StartupTaskState.Enabled:
|
||||
case StartupTaskState.EnabledByPolicy:
|
||||
return StartupBehaviorResult.Enabled;
|
||||
default:
|
||||
return StartupBehaviorResult.Fatal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,28 +4,27 @@ using System.Threading.Tasks;
|
||||
using Windows.Storage;
|
||||
using Wino.Core.Domain.Models.Common;
|
||||
|
||||
namespace Wino.Core.UWP.Extensions
|
||||
namespace Wino.Core.UWP.Extensions;
|
||||
|
||||
public static class StorageFileExtensions
|
||||
{
|
||||
public static class StorageFileExtensions
|
||||
public static async Task<SharedFile> ToSharedFileAsync(this Windows.Storage.StorageFile storageFile)
|
||||
{
|
||||
public static async Task<SharedFile> ToSharedFileAsync(this Windows.Storage.StorageFile storageFile)
|
||||
var content = await storageFile.ToByteArrayAsync();
|
||||
|
||||
return new SharedFile(storageFile.Path, content);
|
||||
}
|
||||
|
||||
public static async Task<byte[]> ToByteArrayAsync(this StorageFile file)
|
||||
{
|
||||
if (file == null)
|
||||
throw new ArgumentNullException(nameof(file));
|
||||
|
||||
using (var stream = await file.OpenReadAsync())
|
||||
using (var memoryStream = new MemoryStream())
|
||||
{
|
||||
var content = await storageFile.ToByteArrayAsync();
|
||||
|
||||
return new SharedFile(storageFile.Path, content);
|
||||
}
|
||||
|
||||
public static async Task<byte[]> ToByteArrayAsync(this StorageFile file)
|
||||
{
|
||||
if (file == null)
|
||||
throw new ArgumentNullException(nameof(file));
|
||||
|
||||
using (var stream = await file.OpenReadAsync())
|
||||
using (var memoryStream = new MemoryStream())
|
||||
{
|
||||
await stream.AsStreamForRead().CopyToAsync(memoryStream);
|
||||
return memoryStream.ToArray();
|
||||
}
|
||||
await stream.AsStreamForRead().CopyToAsync(memoryStream);
|
||||
return memoryStream.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,19 @@
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Extensions
|
||||
namespace Wino.Extensions;
|
||||
|
||||
public static class UIExtensions
|
||||
{
|
||||
public static class UIExtensions
|
||||
public static InfoBarSeverity AsMUXCInfoBarSeverity(this InfoBarMessageType messageType)
|
||||
{
|
||||
public static InfoBarSeverity AsMUXCInfoBarSeverity(this InfoBarMessageType messageType)
|
||||
return messageType switch
|
||||
{
|
||||
return messageType switch
|
||||
{
|
||||
InfoBarMessageType.Error => InfoBarSeverity.Error,
|
||||
InfoBarMessageType.Warning => InfoBarSeverity.Warning,
|
||||
InfoBarMessageType.Information => InfoBarSeverity.Informational,
|
||||
InfoBarMessageType.Success => InfoBarSeverity.Success,
|
||||
_ => InfoBarSeverity.Informational
|
||||
};
|
||||
}
|
||||
InfoBarMessageType.Error => InfoBarSeverity.Error,
|
||||
InfoBarMessageType.Warning => InfoBarSeverity.Warning,
|
||||
InfoBarMessageType.Information => InfoBarSeverity.Informational,
|
||||
InfoBarMessageType.Success => InfoBarSeverity.Success,
|
||||
_ => InfoBarSeverity.Informational
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,101 +8,100 @@ using Windows.UI.Xaml.Controls;
|
||||
using Windows.UI.Xaml.Hosting;
|
||||
using Windows.UI.Xaml.Media;
|
||||
|
||||
namespace Wino.Extensions
|
||||
namespace Wino.Extensions;
|
||||
|
||||
public static class UtilExtensions
|
||||
{
|
||||
public static class UtilExtensions
|
||||
public static float ToFloat(this double value) => (float)value;
|
||||
|
||||
public static List<FrameworkElement> Children(this DependencyObject parent)
|
||||
{
|
||||
public static float ToFloat(this double value) => (float)value;
|
||||
var list = new List<FrameworkElement>();
|
||||
|
||||
public static List<FrameworkElement> Children(this DependencyObject parent)
|
||||
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
|
||||
{
|
||||
var list = new List<FrameworkElement>();
|
||||
var child = VisualTreeHelper.GetChild(parent, i);
|
||||
|
||||
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
|
||||
if (child is FrameworkElement)
|
||||
{
|
||||
var child = VisualTreeHelper.GetChild(parent, i);
|
||||
|
||||
if (child is FrameworkElement)
|
||||
{
|
||||
list.Add(child as FrameworkElement);
|
||||
}
|
||||
|
||||
list.AddRange(Children(child));
|
||||
list.Add(child as FrameworkElement);
|
||||
}
|
||||
|
||||
return list;
|
||||
list.AddRange(Children(child));
|
||||
}
|
||||
|
||||
public static T GetChildByName<T>(this DependencyObject parent, string name)
|
||||
{
|
||||
var childControls = Children(parent);
|
||||
var controls = childControls.OfType<FrameworkElement>();
|
||||
|
||||
if (controls == null)
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
|
||||
var control = controls
|
||||
.Where(x => x.Name.Equals(name))
|
||||
.Cast<T>()
|
||||
.First();
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
public static Visual Visual(this UIElement element) =>
|
||||
ElementCompositionPreview.GetElementVisual(element);
|
||||
|
||||
public static void SetChildVisual(this UIElement element, Visual childVisual) =>
|
||||
ElementCompositionPreview.SetElementChildVisual(element, childVisual);
|
||||
|
||||
public static Point RelativePosition(this UIElement element, UIElement other) =>
|
||||
element.TransformToVisual(other).TransformPoint(new Point(0, 0));
|
||||
|
||||
public static bool IsFullyVisibile(this FrameworkElement element, FrameworkElement parent)
|
||||
{
|
||||
if (element == null || parent == null)
|
||||
return false;
|
||||
|
||||
if (element.Visibility != Visibility.Visible)
|
||||
return false;
|
||||
|
||||
var elementBounds = element.TransformToVisual(parent).TransformBounds(new Windows.Foundation.Rect(0, 0, element.ActualWidth, element.ActualHeight));
|
||||
var containerBounds = new Windows.Foundation.Rect(0, 0, parent.ActualWidth, parent.ActualHeight);
|
||||
|
||||
var originalElementWidth = elementBounds.Width;
|
||||
var originalElementHeight = elementBounds.Height;
|
||||
|
||||
elementBounds.Intersect(containerBounds);
|
||||
|
||||
var newElementWidth = elementBounds.Width;
|
||||
var newElementHeight = elementBounds.Height;
|
||||
|
||||
return originalElementWidth.Equals(newElementWidth) && originalElementHeight.Equals(newElementHeight);
|
||||
}
|
||||
|
||||
public static void ScrollToElement(this ScrollViewer scrollViewer, FrameworkElement element,
|
||||
bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null, bool bringToTopOrLeft = true, bool addMargin = true)
|
||||
{
|
||||
if (!bringToTopOrLeft && element.IsFullyVisibile(scrollViewer))
|
||||
return;
|
||||
|
||||
var contentArea = (FrameworkElement)scrollViewer.Content;
|
||||
var position = element.RelativePosition(contentArea);
|
||||
|
||||
if (isVerticalScrolling)
|
||||
{
|
||||
// Accomodate for additional header.
|
||||
scrollViewer.ChangeView(null, Math.Max(0, position.Y - (addMargin ? 48 : 0)), zoomFactor, !smoothScrolling);
|
||||
}
|
||||
else
|
||||
{
|
||||
scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static T[] GetValues<T>() where T : struct, Enum => Enum.GetValues<T>();
|
||||
return list;
|
||||
}
|
||||
|
||||
public static T GetChildByName<T>(this DependencyObject parent, string name)
|
||||
{
|
||||
var childControls = Children(parent);
|
||||
var controls = childControls.OfType<FrameworkElement>();
|
||||
|
||||
if (controls == null)
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
|
||||
var control = controls
|
||||
.Where(x => x.Name.Equals(name))
|
||||
.Cast<T>()
|
||||
.First();
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
public static Visual Visual(this UIElement element) =>
|
||||
ElementCompositionPreview.GetElementVisual(element);
|
||||
|
||||
public static void SetChildVisual(this UIElement element, Visual childVisual) =>
|
||||
ElementCompositionPreview.SetElementChildVisual(element, childVisual);
|
||||
|
||||
public static Point RelativePosition(this UIElement element, UIElement other) =>
|
||||
element.TransformToVisual(other).TransformPoint(new Point(0, 0));
|
||||
|
||||
public static bool IsFullyVisibile(this FrameworkElement element, FrameworkElement parent)
|
||||
{
|
||||
if (element == null || parent == null)
|
||||
return false;
|
||||
|
||||
if (element.Visibility != Visibility.Visible)
|
||||
return false;
|
||||
|
||||
var elementBounds = element.TransformToVisual(parent).TransformBounds(new Windows.Foundation.Rect(0, 0, element.ActualWidth, element.ActualHeight));
|
||||
var containerBounds = new Windows.Foundation.Rect(0, 0, parent.ActualWidth, parent.ActualHeight);
|
||||
|
||||
var originalElementWidth = elementBounds.Width;
|
||||
var originalElementHeight = elementBounds.Height;
|
||||
|
||||
elementBounds.Intersect(containerBounds);
|
||||
|
||||
var newElementWidth = elementBounds.Width;
|
||||
var newElementHeight = elementBounds.Height;
|
||||
|
||||
return originalElementWidth.Equals(newElementWidth) && originalElementHeight.Equals(newElementHeight);
|
||||
}
|
||||
|
||||
public static void ScrollToElement(this ScrollViewer scrollViewer, FrameworkElement element,
|
||||
bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null, bool bringToTopOrLeft = true, bool addMargin = true)
|
||||
{
|
||||
if (!bringToTopOrLeft && element.IsFullyVisibile(scrollViewer))
|
||||
return;
|
||||
|
||||
var contentArea = (FrameworkElement)scrollViewer.Content;
|
||||
var position = element.RelativePosition(contentArea);
|
||||
|
||||
if (isVerticalScrolling)
|
||||
{
|
||||
// Accomodate for additional header.
|
||||
scrollViewer.ChangeView(null, Math.Max(0, position.Y - (addMargin ? 48 : 0)), zoomFactor, !smoothScrolling);
|
||||
}
|
||||
else
|
||||
{
|
||||
scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static T[] GetValues<T>() where T : struct, Enum => Enum.GetValues<T>();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user