MyPageLeft.vb 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. Public Class MyPageLeft
  2. Inherits Grid
  3. Private Uuid As Integer = GetUuid()
  4. '执行逐个进入动画的控件
  5. Public Property AnimatedControl As FrameworkElement
  6. Get
  7. Return GetValue(AnimatedControlProperty)
  8. End Get
  9. Set(value As FrameworkElement)
  10. SetValue(AnimatedControlProperty, value)
  11. End Set
  12. End Property
  13. Public Shared ReadOnly AnimatedControlProperty As DependencyProperty = DependencyProperty.Register("AnimatedControl", GetType(FrameworkElement), GetType(MyPageLeft), New PropertyMetadata(Nothing))
  14. Public Sub TriggerShowAnimation()
  15. If AnimatedControl Is Nothing Then
  16. '缩放动画
  17. If TypeOf RenderTransform IsNot ScaleTransform Then
  18. RenderTransform = New ScaleTransform(0.96, 0.96)
  19. RenderTransformOrigin = New Point(0.5, 0.5)
  20. End If
  21. Opacity = 0
  22. AniStart({
  23. AaScaleTransform(Me, 1 - CType(RenderTransform, ScaleTransform).ScaleX, 400,, New AniEaseOutBack(2)),
  24. AaOpacity(Me, 1, 100)
  25. }, "PageLeft PageChange " & Uuid)
  26. Else
  27. '逐个进入动画
  28. Dim AniList As New List(Of AniData)
  29. Dim Id As Integer = 0, Delay As Integer = 0
  30. For Each Element As FrameworkElement In GetAllAnimControls(True)
  31. If Element.Visibility = Visibility.Collapsed Then
  32. '还原之前的隐藏动画可能导致的改变(#2436)
  33. Element.Opacity = 1
  34. Element.RenderTransform = New TranslateTransform(0, 0)
  35. If TypeOf Element Is MyListItem Then CType(Element, MyListItem).IsMouseOverAnimationEnabled = True
  36. Else
  37. Element.Opacity = 0
  38. Element.RenderTransform = New TranslateTransform(-25, 0)
  39. If TypeOf Element Is MyListItem Then CType(Element, MyListItem).IsMouseOverAnimationEnabled = False
  40. AniList.Add(AaOpacity(Element, If(TypeOf Element Is TextBlock, 0.6, 1), 200, Delay, New AniEaseOutFluent(AniEasePower.Weak)))
  41. AniList.Add(AaTranslateX(Element, 5, 200, Delay, New AniEaseOutFluent))
  42. AniList.Add(AaTranslateX(Element, 20, 300, Delay, New AniEaseOutBack(AniEasePower.Weak)))
  43. If TypeOf Element Is MyListItem Then
  44. AniList.Add(AaCode(Sub()
  45. CType(Element, MyListItem).IsMouseOverAnimationEnabled = True
  46. CType(Element, MyListItem).RefreshColor(Me, New EventArgs)
  47. End Sub, Delay + 280))
  48. End If
  49. Delay += Math.Max(8, 20 - Id) * 2.5
  50. Id += 1
  51. End If
  52. Next
  53. AniStart(AniList, "PageLeft PageChange " & Uuid)
  54. End If
  55. End Sub
  56. Public Sub TriggerHideAnimation()
  57. If AnimatedControl Is Nothing Then
  58. '缩放动画
  59. If TypeOf RenderTransform IsNot ScaleTransform Then
  60. RenderTransform = New ScaleTransform(1, 1)
  61. RenderTransformOrigin = New Point(0.5, 0.5)
  62. End If
  63. AniStart({
  64. AaScaleTransform(Me, 0.95 - CType(RenderTransform, ScaleTransform).ScaleX, 130,, New AniEaseInFluent(AniEasePower.Weak)),
  65. AaOpacity(Me, -Opacity, 100, 30)
  66. }, "PageLeft PageChange " & Uuid)
  67. Else
  68. '逐个退出动画
  69. Dim AniList As New List(Of AniData)
  70. Dim Id As Integer = 0
  71. Dim Controls = GetAllAnimControls()
  72. For Each Element As FrameworkElement In Controls
  73. AniList.Add(AaOpacity(Element, -Element.Opacity, 60, 80 / Controls.Count * Id))
  74. AniList.Add(AaTranslateX(Element, -6, 60, 80 / Controls.Count * Id))
  75. Id += 1
  76. Next
  77. AniStart(AniList, "PageLeft PageChange " & Uuid)
  78. End If
  79. End Sub
  80. '遍历获取所有需要生成动画的控件
  81. Private Function GetAllAnimControls(Optional IgnoreInvisibility As Boolean = False) As List(Of FrameworkElement)
  82. Dim AllControls As New List(Of FrameworkElement)
  83. GetAllAnimControls(AnimatedControl, AllControls, IgnoreInvisibility)
  84. Return AllControls
  85. End Function
  86. Private Sub GetAllAnimControls(Element As FrameworkElement, ByRef AllControls As List(Of FrameworkElement), IgnoreInvisibility As Boolean)
  87. If Not IgnoreInvisibility AndAlso Element.Visibility = Visibility.Collapsed Then Exit Sub
  88. If TypeOf Element Is MyTextButton Then
  89. AllControls.Add(Element)
  90. ElseIf TypeOf Element Is MyListItem Then
  91. AllControls.Add(Element)
  92. ElseIf TypeOf Element Is ContentControl Then
  93. GetAllAnimControls(CType(Element, ContentControl).Content, AllControls, IgnoreInvisibility)
  94. ElseIf TypeOf Element Is Panel Then
  95. For Each Element2 As FrameworkElement In CType(Element, Panel).Children
  96. GetAllAnimControls(Element2, AllControls, IgnoreInvisibility)
  97. Next
  98. Else
  99. AllControls.Add(Element)
  100. End If
  101. End Sub
  102. End Class