MyExtraButton.xaml.vb 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. Public Class MyExtraButton
  2. '声明
  3. Public Event Click(sender As Object, e As MouseButtonEventArgs) '自定义事件
  4. Public Event RightClick(sender As Object, e As MouseButtonEventArgs)
  5. '自定义属性
  6. Public Uuid As Integer = GetUuid()
  7. Private _Logo As String = ""
  8. Public Property Logo As String
  9. Get
  10. Return _Logo
  11. End Get
  12. Set(value As String)
  13. If value = _Logo Then Exit Property
  14. _Logo = value
  15. Path.Data = (New GeometryConverter).ConvertFromString(value)
  16. End Set
  17. End Property
  18. Private _LogoScale As Double = 1
  19. Public Property LogoScale() As Double
  20. Get
  21. Return _LogoScale
  22. End Get
  23. Set(value As Double)
  24. _LogoScale = value
  25. If Not IsNothing(Path) Then Path.RenderTransform = New ScaleTransform With {.ScaleX = LogoScale, .ScaleY = LogoScale}
  26. End Set
  27. End Property
  28. Private _Show As Boolean = False
  29. Public Property Show As Boolean
  30. Get
  31. Return _Show
  32. End Get
  33. Set(value As Boolean)
  34. If _Show = value Then Exit Property
  35. _Show = value
  36. RunInUi(Sub()
  37. If value Then
  38. '有了
  39. Visibility = Visibility.Visible
  40. AniStart({
  41. AaScaleTransform(Me, 0.3 - CType(RenderTransform, ScaleTransform).ScaleX, 500, 60, New AniEaseOutFluent(AniEasePower.Weak)),
  42. AaScaleTransform(Me, 0.7, 500, 60, New AniEaseOutBack(AniEasePower.Weak)),
  43. AaHeight(Me, 50 - Height, 200,, New AniEaseOutFluent(AniEasePower.Weak))
  44. }, "MyExtraButton MainScale " & Uuid)
  45. Else
  46. '没了
  47. AniStart({
  48. AaScaleTransform(Me, -CType(RenderTransform, ScaleTransform).ScaleX, 100,, New AniEaseInFluent(AniEasePower.Weak)),
  49. AaHeight(Me, -Height, 400, 100, New AniEaseOutFluent()),
  50. AaCode(Sub() Visibility = Visibility.Collapsed,, True)
  51. }, "MyExtraButton MainScale " & Uuid)
  52. End If
  53. IsHitTestVisible = value '防止缩放动画中依然可以点进去
  54. End Sub)
  55. End Set
  56. End Property
  57. Public Delegate Function ShowCheckDelegate() As Boolean
  58. Public ShowCheck As ShowCheckDelegate = Nothing
  59. Public Sub ShowRefresh()
  60. If ShowCheck IsNot Nothing Then Show = ShowCheck()
  61. End Sub
  62. '触发点击事件
  63. Private Sub Button_LeftMouseUp(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseLeftButtonUp
  64. If IsLeftMouseHeld Then
  65. Log("[Control] 按下附加按钮" & If(ToolTip = "", "", ":" & ToolTip.ToString))
  66. RaiseEvent Click(sender, e)
  67. e.Handled = True
  68. Button_LeftMouseUp()
  69. End If
  70. End Sub
  71. Private Sub Button_RightMouseUp(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseRightButtonUp
  72. If IsRightMouseHeld Then
  73. Log("[Control] 右键按下附加按钮" & If(ToolTip = "", "", ":" & ToolTip.ToString))
  74. RaiseEvent RightClick(sender, e)
  75. e.Handled = True
  76. Button_RightMouseUp()
  77. End If
  78. End Sub
  79. Private _CanRightClick As Boolean = False
  80. Public Property CanRightClick As Boolean
  81. Get
  82. Return _CanRightClick
  83. End Get
  84. Set(ByVal value As Boolean)
  85. _CanRightClick = value
  86. End Set
  87. End Property
  88. '鼠标点击判定(务必放在点击事件之后,以使得 Button_MouseUp 先于 Button_MouseLeave 执行)
  89. Private IsLeftMouseHeld As Boolean = False
  90. Private IsRightMouseHeld As Boolean = False
  91. Private Sub Button_LeftMouseDown(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseLeftButtonDown
  92. If Not IsLeftMouseHeld AndAlso Not IsRightMouseHeld Then
  93. AniStart({
  94. AaScaleTransform(PanScale, 0.85 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  95. AaScaleTransform(PanScale, -0.05, 60,, New AniEaseOutFluent)
  96. }, "MyExtraButton Scale " & Uuid)
  97. End If
  98. IsLeftMouseHeld = True
  99. Focus()
  100. End Sub
  101. Private Sub Button_RightMouseDown(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseRightButtonDown
  102. If Not CanRightClick Then Exit Sub
  103. If Not IsLeftMouseHeld AndAlso Not IsRightMouseHeld Then
  104. AniStart({
  105. AaScaleTransform(PanScale, 0.85 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  106. AaScaleTransform(PanScale, -0.05, 60,, New AniEaseOutFluent)
  107. }, "MyExtraButton Scale " & Uuid)
  108. End If
  109. IsRightMouseHeld = True
  110. Focus()
  111. End Sub
  112. Private Sub Button_LeftMouseUp() Handles PanClick.MouseLeftButtonUp
  113. If Not IsRightMouseHeld Then
  114. AniStart({
  115. AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 300,, New AniEaseOutBack)
  116. }, "MyExtraButton Scale " & Uuid)
  117. End If
  118. IsLeftMouseHeld = False
  119. RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
  120. End Sub
  121. Private Sub Button_RightMouseUp() Handles PanClick.MouseRightButtonUp
  122. If Not CanRightClick Then Exit Sub
  123. If Not IsLeftMouseHeld Then
  124. AniStart({
  125. AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 300,, New AniEaseOutBack)
  126. }, "MyExtraButton Scale " & Uuid)
  127. End If
  128. IsRightMouseHeld = False
  129. RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
  130. End Sub
  131. Private Sub Button_MouseLeave() Handles PanClick.MouseLeave
  132. IsLeftMouseHeld = False
  133. IsRightMouseHeld = False
  134. AniStart({
  135. AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 500,, New AniEaseOutFluent)
  136. }, "MyExtraButton Scale " & Uuid)
  137. RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
  138. End Sub
  139. '自定义事件
  140. '务必放在 IsMouseDown 更新之后
  141. Private Const AnimationColorIn As Integer = 120
  142. Private Const AnimationColorOut As Integer = 150
  143. Public Sub RefreshColor() Handles PanClick.MouseEnter, PanClick.MouseLeave, Me.Loaded
  144. Try
  145. If IsLoaded AndAlso AniControlEnabled = 0 Then '防止默认属性变更触发动画
  146. If IsMouseOver Then
  147. '指向
  148. AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrush4", AnimationColorIn), "MyExtraButton Color " & Uuid)
  149. Else
  150. '普通
  151. AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrush3", AnimationColorOut), "MyExtraButton Color " & Uuid)
  152. End If
  153. Else
  154. AniStop("MyExtraButton Color " & Uuid)
  155. If IsMouseOver Then
  156. PanColor.SetResourceReference(BackgroundProperty, "ColorBrush2")
  157. Else
  158. PanColor.SetResourceReference(BackgroundProperty, "ColorBrush3")
  159. End If
  160. End If
  161. Catch ex As Exception
  162. Log(ex, "刷新图标按钮颜色出错")
  163. End Try
  164. End Sub
  165. ''' <summary>
  166. ''' 发出一圈波浪效果提示。
  167. ''' </summary>
  168. Public Sub Ribble()
  169. RunInUi(Sub()
  170. Dim Shape As New Border With {.CornerRadius = New CornerRadius(1000), .BorderThickness = New Thickness(0.001), .Opacity = 0.5, .RenderTransformOrigin = New Point(0.5, 0.5), .RenderTransform = New ScaleTransform()}
  171. Shape.SetResourceReference(Border.BackgroundProperty, "ColorBrush5")
  172. PanScale.Children.Insert(0, Shape)
  173. AniStart({
  174. AaScaleTransform(Shape, 13, 1000, Ease:=New AniEaseInoutFluent(AniEasePower.Strong, 0.3)),
  175. AaOpacity(Shape, -Shape.Opacity, 1000),
  176. AaCode(Sub() PanScale.Children.Remove(Shape), After:=True)
  177. }, "ExtraButton Ribble " & GetUuid())
  178. End Sub)
  179. End Sub
  180. End Class