1
0

MyExtraButton.xaml.vb 9.1 KB

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