MyPageLeft.vb 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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), 100, 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(
  45. Sub()
  46. CType(Element, MyListItem).IsMouseOverAnimationEnabled = True
  47. CType(Element, MyListItem).RefreshColor(Me, New EventArgs)
  48. End Sub, Delay + 280))
  49. End If
  50. Delay += Math.Max(15 - Id, 7) * 2
  51. Id += 1
  52. End If
  53. Next
  54. AniStart(AniList, "PageLeft PageChange " & Uuid)
  55. End If
  56. End Sub
  57. Public Sub TriggerHideAnimation()
  58. If AnimatedControl Is Nothing Then
  59. '缩放动画
  60. If TypeOf RenderTransform IsNot ScaleTransform Then
  61. RenderTransform = New ScaleTransform(1, 1)
  62. RenderTransformOrigin = New Point(0.5, 0.5)
  63. End If
  64. AniStart({
  65. AaScaleTransform(Me, 0.95 - CType(RenderTransform, ScaleTransform).ScaleX, 110,, New AniEaseInFluent(AniEasePower.Weak)),
  66. AaOpacity(Me, -Opacity, 80, 30)
  67. }, "PageLeft PageChange " & Uuid)
  68. Else
  69. '逐个退出动画
  70. Dim AniList As New List(Of AniData)
  71. Dim Id As Integer = 0
  72. Dim Controls = GetAllAnimControls()
  73. For Each Element As FrameworkElement In Controls
  74. AniList.Add(AaOpacity(Element, -Element.Opacity, 50, 70 / Controls.Count * Id))
  75. AniList.Add(AaTranslateX(Element, -6, 50, 70 / Controls.Count * Id))
  76. Id += 1
  77. Next
  78. AniStart(AniList, "PageLeft PageChange " & Uuid)
  79. End If
  80. End Sub
  81. '遍历获取所有需要生成动画的控件
  82. Private Function GetAllAnimControls(Optional IgnoreInvisibility As Boolean = False) As List(Of FrameworkElement)
  83. Dim AllControls As New List(Of FrameworkElement)
  84. GetAllAnimControls(AnimatedControl, AllControls, IgnoreInvisibility)
  85. Return AllControls
  86. End Function
  87. Private Sub GetAllAnimControls(Element As FrameworkElement, ByRef AllControls As List(Of FrameworkElement), IgnoreInvisibility As Boolean)
  88. If Not IgnoreInvisibility AndAlso Element.Visibility = Visibility.Collapsed Then Return
  89. If TypeOf Element Is MyTextButton Then
  90. AllControls.Add(Element)
  91. ElseIf TypeOf Element Is MyListItem Then
  92. AllControls.Add(Element)
  93. ElseIf TypeOf Element Is ContentControl Then
  94. GetAllAnimControls(CType(Element, ContentControl).Content, AllControls, IgnoreInvisibility)
  95. ElseIf TypeOf Element Is Panel Then
  96. For Each Element2 As FrameworkElement In CType(Element, Panel).Children
  97. GetAllAnimControls(Element2, AllControls, IgnoreInvisibility)
  98. Next
  99. Else
  100. AllControls.Add(Element)
  101. End If
  102. End Sub
  103. End Class
  104. Public Interface IRefreshable
  105. Sub Refresh()
  106. End Interface