MyPageLeft.vb 5.3 KB

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