| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- Public Class MyPageLeft
- Inherits Grid
- Private Uuid As Integer = GetUuid()
- '执行逐个进入动画的控件
- Public Property AnimatedControl As String '需要在 Loaded 之后才能获取到控件,所以不能用 Binding 直接绑定(#6664)
- Get
- Return GetValue(AnimatedControlProperty)
- End Get
- Set(value As String)
- SetValue(AnimatedControlProperty, value)
- End Set
- End Property
- Public Shared ReadOnly AnimatedControlProperty As DependencyProperty = DependencyProperty.Register("AnimatedControl", GetType(String), GetType(MyPageLeft), New PropertyMetadata(Nothing))
- 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)
- Element = MyVirtualizingElement.TryInit(Element)
- 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(FindName(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
|