MyPageLeft.vb 5.9 KB

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