这是下面所描述方法的实现视频演示。
我曾经使用ScrollViewerOffsetMediator,这是一个扩展方法,依赖于ScrollToVerticalOffset方法来平滑地动画滚动ScrollViewer内容。然而,在Windows 10中,ScrollToVerticalOffset已经被弃用,尽管它在Windows 10的一些早期版本中可以工作,但现在不再支持。
新的ChangeView方法既不能提供平滑的滚动也不能控制滚动视图的内容。因此,这里是我找到的解决方案:
在ScrollViewer中放置一个Grid。使用RenderTransform对网格内容进行动画处理。使用新的ChangeView方法来设置您最终期望的垂直和水平ScrollViewer位置,在设置网格内容动画的变换时。在网格变换中,通过最终期望的ChangeView偏移量来偏移初始值,以便为ChangeView方法造成的立即跳转校正动画开始参考点。
XAML:
<ScrollViewer x:Name="MyScrollView">
<Grid Name="MyGrid">
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Grid.RenderTransform>
<!-- Original ScrollViewer Contents Here... -->
</Grid>
</ScrollViewer>
代码:
Public Sub AnimateProperty(Obj As DependencyObject, PropPath As String, StartValue As Double, EndValue As Double, Optional PeriodMS As Integer = 350)
Dim Storya As New Storyboard
Dim DA1 As New DoubleAnimationUsingKeyFrames With {.BeginTime = New TimeSpan(0, 0, 0)}
Storyboard.SetTarget(DA1, Obj)
Storyboard.SetTargetProperty(DA1, PropPath)
Dim ddkf1 As New DiscreteDoubleKeyFrame With {.KeyTime = New TimeSpan(0, 0, 0), .Value = StartValue}
Dim edkf1 As New EasingDoubleKeyFrame With {.Value = EndValue, .KeyTime = New TimeSpan(0, 0, 0, 0, PeriodMS)}
Dim pe1 As New PowerEase With {.EasingMode = EasingMode.EaseIn}
edkf1.EasingFunction = pe1
DA1.KeyFrames.Add(ddkf1)
DA1.KeyFrames.Add(edkf1)
Storya.Children.Add(DA1)
Storya.Begin()
End Sub
例子:
AnimateProperty(MyGrid, "(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)", 1, 1.4, 350)
AnimateProperty(MyGrid, "(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)", 1, 1.4, 350)
AnimateProperty(MyGrid, "(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)", -MyScrollView.VerticalOffset, -120, 350)
MyScrollView.ChangeView(Nothing, 0, Nothing, True)
在这个例子中,无论ScrollView的初始垂直位置是什么,内容都将平稳地动画到一个固定的垂直位置和缩放比例。
MyScrollView.ChangeView(null,abosulatePosition.Y,null,true);
。 - Nejdi Kroi