Public Class MyPageLeft Inherits Grid Private Uuid As Integer = GetUuid() '执行逐个进入动画的控件 Public AnimatedControl As FrameworkElement Public Shared ReadOnly AnimatedControlProperty As DependencyProperty = DependencyProperty.RegisterAttached("AnimatedControl", GetType(String), GetType(MyPageLeft), New PropertyMetadata(Nothing, AddressOf OnAnimatedControlChanged)) Public Shared Sub SetAnimatedControl(obj As DependencyObject, value As String) obj.SetValue(AnimatedControlProperty, value) End Sub Private Shared Sub OnAnimatedControlChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) Dim control = TryCast(d, MyPageLeft) If control IsNot Nothing Then Dim handler As RoutedEventHandler handler = Sub(sender, args) Dim targetName = CStr(e.NewValue) Dim target = TryCast(control.FindName(targetName), FrameworkElement) If target IsNot Nothing Then control.AnimatedControl = target End If RemoveHandler control.Loaded, handler End Sub AddHandler control.Loaded, handler End If End Sub Public Sub TriggerShowAnimation() If AnimatedControl Is Nothing Then '缩放动画 If TypeOf RenderTransform IsNot ScaleTransform Then RenderTransform = New ScaleTransform(0.96, 0.96) RenderTransformOrigin = New Point(0.5, 0.5) End If Opacity = 0 AniStart({ AaScaleTransform(Me, 1 - CType(RenderTransform, ScaleTransform).ScaleX, 400,, New AniEaseOutBack(2)), AaOpacity(Me, 1, 100) }, "PageLeft PageChange " & Uuid) Else '逐个进入动画 Dim AniList As New List(Of AniData) Dim Id As Integer = 0, Delay As Integer = 0 For Each Element As FrameworkElement In GetAllAnimControls(True) If Element.Visibility = Visibility.Collapsed Then '还原之前的隐藏动画可能导致的改变(#2436) Element.Opacity = 1 Element.RenderTransform = New TranslateTransform(0, 0) If TypeOf Element Is MyListItem Then CType(Element, MyListItem).IsMouseOverAnimationEnabled = True Else Element.Opacity = 0 Element.RenderTransform = New TranslateTransform(-25, 0) If TypeOf Element Is MyListItem Then CType(Element, MyListItem).IsMouseOverAnimationEnabled = False AniList.Add(AaOpacity(Element, If(TypeOf Element Is TextBlock, 0.6, 1), 100, Delay, New AniEaseOutFluent(AniEasePower.Weak))) AniList.Add(AaTranslateX(Element, 5, 200, Delay, New AniEaseOutFluent)) AniList.Add(AaTranslateX(Element, 20, 300, Delay, New AniEaseOutBack(AniEasePower.Weak))) If TypeOf Element Is MyListItem Then AniList.Add(AaCode( Sub() CType(Element, MyListItem).IsMouseOverAnimationEnabled = True CType(Element, MyListItem).RefreshColor(Me, New EventArgs) End Sub, Delay + 280)) End If Delay += Math.Max(15 - Id, 7) * 2 Id += 1 End If Next AniStart(AniList, "PageLeft PageChange " & Uuid) End If End Sub Public Sub TriggerHideAnimation() If AnimatedControl Is Nothing Then '缩放动画 If TypeOf RenderTransform IsNot ScaleTransform Then RenderTransform = New ScaleTransform(1, 1) RenderTransformOrigin = New Point(0.5, 0.5) End If AniStart({ AaScaleTransform(Me, 0.95 - CType(RenderTransform, ScaleTransform).ScaleX, 110,, New AniEaseInFluent(AniEasePower.Weak)), AaOpacity(Me, -Opacity, 80, 30) }, "PageLeft PageChange " & Uuid) Else '逐个退出动画 Dim AniList As New List(Of AniData) Dim Id As Integer = 0 Dim Controls = GetAllAnimControls() For Each Element As FrameworkElement In Controls AniList.Add(AaOpacity(Element, -Element.Opacity, 50, 70 / Controls.Count * Id)) AniList.Add(AaTranslateX(Element, -6, 50, 70 / Controls.Count * Id)) Id += 1 Next AniStart(AniList, "PageLeft PageChange " & Uuid) End If End Sub '遍历获取所有需要生成动画的控件 Private Function GetAllAnimControls(Optional IgnoreInvisibility As Boolean = False) As List(Of FrameworkElement) Dim AllControls As New List(Of FrameworkElement) GetAllAnimControls(AnimatedControl, AllControls, IgnoreInvisibility) Return AllControls End Function Private Sub GetAllAnimControls(Element As FrameworkElement, ByRef AllControls As List(Of FrameworkElement), IgnoreInvisibility As Boolean) If Not IgnoreInvisibility AndAlso Element.Visibility = Visibility.Collapsed Then Return If TypeOf Element Is MyTextButton Then AllControls.Add(Element) ElseIf TypeOf Element Is MyListItem Then AllControls.Add(Element) ElseIf TypeOf Element Is ContentControl Then GetAllAnimControls(CType(Element, ContentControl).Content, AllControls, IgnoreInvisibility) ElseIf TypeOf Element Is Panel Then For Each Element2 As FrameworkElement In CType(Element, Panel).Children GetAllAnimControls(Element2, AllControls, IgnoreInvisibility) Next Else AllControls.Add(Element) End If End Sub End Class Public Interface IRefreshable Sub Refresh() End Interface