1
0

MyExtraTextButton.xaml.vb 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. Imports System.Windows.Markup
  2. <ContentProperty("Inlines")>
  3. Public Class MyExtraTextButton
  4. '声明
  5. Public Event Click(sender As Object, e As MouseButtonEventArgs) '自定义事件
  6. '自定义属性
  7. Public Uuid As Integer = GetUuid()
  8. Private _Logo As String = ""
  9. Public Property Logo As String
  10. Get
  11. Return _Logo
  12. End Get
  13. Set(value As String)
  14. If value = _Logo Then Return
  15. _Logo = value
  16. Path.Data = (New GeometryConverter).ConvertFromString(value)
  17. End Set
  18. End Property
  19. Private _LogoScale As Double = 1
  20. Public Property LogoScale() As Double
  21. Get
  22. Return _LogoScale
  23. End Get
  24. Set(value As Double)
  25. _LogoScale = value
  26. If Path IsNot Nothing Then Path.RenderTransform = New ScaleTransform With {.ScaleX = LogoScale, .ScaleY = LogoScale}
  27. End Set
  28. End Property
  29. '显示文本
  30. Public ReadOnly Property Inlines As InlineCollection
  31. Get
  32. Return LabText.Inlines
  33. End Get
  34. End Property
  35. Public Property Text As String
  36. Get
  37. Return GetValue(TextProperty)
  38. End Get
  39. Set(value As String)
  40. SetValue(TextProperty, value)
  41. End Set
  42. End Property
  43. Public Shared ReadOnly TextProperty As DependencyProperty = DependencyProperty.Register("Text", GetType(String), GetType(MyExtraTextButton), New PropertyMetadata(New PropertyChangedCallback(
  44. Sub(sender As DependencyObject, e As DependencyPropertyChangedEventArgs)
  45. If sender IsNot Nothing Then CType(sender, MyExtraTextButton).LabText.Text = e.NewValue
  46. End Sub)))
  47. '动画
  48. Private _Show As Boolean = False
  49. Public Property Show As Boolean
  50. Get
  51. Return _Show
  52. End Get
  53. Set(value As Boolean)
  54. If _Show = value Then Return
  55. _Show = value
  56. RunInUi(
  57. Sub()
  58. If value Then
  59. '有了
  60. Opacity = 0
  61. AniStart({
  62. AaOpacity(Me, 1 - Opacity, 80, 50),
  63. AaScaleTransform(Me, 0.15 - CType(RenderTransform, ScaleTransform).ScaleX, 400, 50, New AniEaseOutBack),
  64. AaScaleTransform(Me, 0.85, 160, 50, New AniEaseOutFluent(AniEasePower.Middle))
  65. }, "MyExtraTextButton MainScale " & Uuid)
  66. Else
  67. '没了
  68. AniStart({
  69. AaOpacity(Me, -Opacity, 50, 50),
  70. AaScaleTransform(Me, -CType(RenderTransform, ScaleTransform).ScaleX, 100,, New AniEaseInFluent(AniEasePower.Weak))
  71. }, "MyExtraTextButton MainScale " & Uuid)
  72. End If
  73. IsHitTestVisible = value '防止缩放动画中依然可以点进去
  74. End Sub)
  75. End Set
  76. End Property
  77. '触发点击事件
  78. Private Sub Button_LeftMouseUp(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseLeftButtonUp
  79. If Not IsLeftMouseHeld Then Return
  80. Log("[Control] 按下附加图标按钮:" & Text)
  81. RaiseEvent Click(sender, e)
  82. e.Handled = True
  83. RaiseCustomEvent()
  84. Button_LeftMouseUp()
  85. End Sub
  86. '鼠标点击判定(务必放在点击事件之后,以使得 Button_MouseUp 先于 Button_MouseLeave 执行)
  87. Private IsLeftMouseHeld As Boolean = False
  88. Private Sub Button_LeftMouseDown(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseLeftButtonDown
  89. If Not IsLeftMouseHeld Then
  90. AniStart({
  91. AaScaleTransform(PanScale, 0.85 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  92. AaScaleTransform(PanScale, -0.05, 60,, New AniEaseOutFluent)
  93. }, "MyExtraTextButton Scale " & Uuid)
  94. End If
  95. IsLeftMouseHeld = True
  96. Focus()
  97. End Sub
  98. Private Sub Button_LeftMouseUp() Handles PanClick.MouseLeftButtonUp
  99. AniStart({
  100. AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 300,, New AniEaseOutBack)
  101. }, "MyExtraTextButton Scale " & Uuid)
  102. IsLeftMouseHeld = False
  103. RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
  104. End Sub
  105. Private Sub Button_RightMouseUp() Handles PanClick.MouseRightButtonUp
  106. If Not IsLeftMouseHeld Then
  107. AniStart({
  108. AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 300,, New AniEaseOutBack)
  109. }, "MyExtraTextButton Scale " & Uuid)
  110. End If
  111. RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
  112. End Sub
  113. Private Sub Button_MouseLeave() Handles PanClick.MouseLeave
  114. IsLeftMouseHeld = False
  115. AniStart({
  116. AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 500,, New AniEaseOutFluent)
  117. }, "MyExtraTextButton Scale " & Uuid)
  118. RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
  119. End Sub
  120. '自定义事件
  121. '务必放在 IsMouseDown 更新之后
  122. Private Const AnimationColorIn As Integer = 120
  123. Private Const AnimationColorOut As Integer = 150
  124. Public Sub RefreshColor() Handles PanClick.MouseEnter, PanClick.MouseLeave, Me.Loaded, Me.IsEnabledChanged
  125. Try
  126. If IsLoaded AndAlso AniControlEnabled = 0 Then '防止默认属性变更触发动画
  127. If Not IsEnabled Then
  128. '禁用
  129. AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrushGray4", AnimationColorIn), "MyExtraTextButton Color " & Uuid)
  130. ElseIf IsMouseOver Then
  131. '指向
  132. AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrush4", AnimationColorIn), "MyExtraTextButton Color " & Uuid)
  133. Else
  134. '普通
  135. AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrush3", AnimationColorOut), "MyExtraTextButton Color " & Uuid)
  136. End If
  137. Else
  138. AniStop("MyExtraTextButton Color " & Uuid)
  139. If Not IsEnabled Then
  140. PanColor.SetResourceReference(BackgroundProperty, "ColorBrushGray4")
  141. ElseIf IsMouseOver Then
  142. PanColor.SetResourceReference(BackgroundProperty, "ColorBrush4")
  143. Else
  144. PanColor.SetResourceReference(BackgroundProperty, "ColorBrush3")
  145. End If
  146. End If
  147. Catch ex As Exception
  148. Log(ex, "刷新附加图标按钮颜色出错")
  149. End Try
  150. End Sub
  151. End Class