in XamlControlsGallery/ControlPages/ScrollViewer2Page.xaml.cs [153:237]
private void Scroller4_ScrollAnimationStarting(muxc.ScrollViewer sender, muxc.ScrollAnimationStartingEventArgs args)
{
try
{
Vector3KeyFrameAnimation stockKeyFrameAnimation = args.Animation as Vector3KeyFrameAnimation;
if (stockKeyFrameAnimation != null)
{
Vector3KeyFrameAnimation customKeyFrameAnimation = stockKeyFrameAnimation;
if (nameof(ScrollAnimationOptions.Default) != (string)cbAnimation.SelectedItem)
{
double targetHorizontalOffset = args.EndPosition.X;
float targetHorizontalPosition = ComputeHorizontalPositionFromOffset(sender.Content, targetHorizontalOffset, sender.ZoomFactor);
double targetVerticalOffset = args.EndPosition.Y;
float targetVerticalPosition = ComputeVerticalPositionFromOffset(sender.Content, targetVerticalOffset, sender.ZoomFactor);
customKeyFrameAnimation = stockKeyFrameAnimation.Compositor.CreateVector3KeyFrameAnimation();
float deltaHorizontalPosition = (float)(targetHorizontalOffset - sender.HorizontalOffset);
float deltaVerticalPosition = (float)(targetVerticalOffset - sender.VerticalOffset);
switch ((string)cbAnimation.SelectedItem)
{
case nameof(ScrollAnimationOptions.Custom1):
// "Accordion" case
for (int keyframe = 0; keyframe < 3; keyframe++)
{
customKeyFrameAnimation.InsertKeyFrame(
1.0f - (0.4f / (float)Math.Pow(2, keyframe)),
new Vector3(targetHorizontalPosition + 0.1f * deltaHorizontalPosition, targetVerticalPosition + 0.1f * deltaVerticalPosition, 0.0f));
deltaHorizontalPosition /= -2.0f;
deltaVerticalPosition /= -2.0f;
}
customKeyFrameAnimation.InsertKeyFrame(1.0f, new Vector3(targetHorizontalPosition, targetVerticalPosition, 0.0f));
break;
case nameof(ScrollAnimationOptions.Custom2):
// "Teleportation" case
CubicBezierEasingFunction cubicBezierStart = stockKeyFrameAnimation.Compositor.CreateCubicBezierEasingFunction(
new Vector2(1.0f, 0.0f),
new Vector2(1.0f, 0.0f));
StepEasingFunction step = stockKeyFrameAnimation.Compositor.CreateStepEasingFunction(1);
CubicBezierEasingFunction cubicBezierEnd = stockKeyFrameAnimation.Compositor.CreateCubicBezierEasingFunction(
new Vector2(0.0f, 1.0f),
new Vector2(0.0f, 1.0f));
customKeyFrameAnimation.InsertKeyFrame(
0.499999f,
new Vector3(targetHorizontalPosition - 0.75f * deltaHorizontalPosition, targetVerticalPosition - 0.75f * deltaVerticalPosition, 0.0f),
cubicBezierStart);
customKeyFrameAnimation.InsertKeyFrame(
0.5f,
new Vector3(targetHorizontalPosition - 0.25f * deltaHorizontalPosition, targetVerticalPosition - 0.25f * deltaVerticalPosition, 0.0f),
step);
customKeyFrameAnimation.InsertKeyFrame(
1.0f,
new Vector3(targetHorizontalPosition, targetVerticalPosition, 0.0f),
cubicBezierEnd);
break;
default:
break;
}
customKeyFrameAnimation.Duration = stockKeyFrameAnimation.Duration;
}
if (!string.IsNullOrWhiteSpace(tbAnimDuration.Text))
{
// Override animation duration
double durationOverride = Convert.ToDouble(tbAnimDuration.Text);
customKeyFrameAnimation.Duration = TimeSpan.FromMilliseconds(durationOverride);
}
args.Animation = customKeyFrameAnimation;
}
}
catch (Exception ex)
{
}
}