MyExtraButton.xaml.vb 9.0 KB

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