| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- Imports System.Windows.Markup
- <ContentProperty("Inlines")>
- Public Class MyExtraTextButton
- '声明
- Public Event Click(sender As Object, e As MouseButtonEventArgs) '自定义事件
- '自定义属性
- Public Uuid As Integer = GetUuid()
- Private _Logo As String = ""
- Public Property Logo As String
- Get
- Return _Logo
- End Get
- Set(value As String)
- If value = _Logo Then Return
- _Logo = value
- Path.Data = (New GeometryConverter).ConvertFromString(value)
- End Set
- End Property
- Private _LogoScale As Double = 1
- Public Property LogoScale() As Double
- Get
- Return _LogoScale
- End Get
- Set(value As Double)
- _LogoScale = value
- If Path IsNot Nothing Then Path.RenderTransform = New ScaleTransform With {.ScaleX = LogoScale, .ScaleY = LogoScale}
- End Set
- End Property
- '显示文本
- Public ReadOnly Property Inlines As InlineCollection
- Get
- Return LabText.Inlines
- End Get
- End Property
- Public Property Text As String
- Get
- Return GetValue(TextProperty)
- End Get
- Set(value As String)
- SetValue(TextProperty, value)
- End Set
- End Property
- Public Shared ReadOnly TextProperty As DependencyProperty = DependencyProperty.Register("Text", GetType(String), GetType(MyExtraTextButton), New PropertyMetadata(New PropertyChangedCallback(
- Sub(sender As DependencyObject, e As DependencyPropertyChangedEventArgs)
- If sender IsNot Nothing Then CType(sender, MyExtraTextButton).LabText.Text = e.NewValue
- End Sub)))
- '动画
- Private _Show As Boolean = False
- Public Property Show As Boolean
- Get
- Return _Show
- End Get
- Set(value As Boolean)
- If _Show = value Then Return
- _Show = value
- RunInUi(
- Sub()
- If value Then
- '有了
- Opacity = 0
- AniStart({
- AaOpacity(Me, 1 - Opacity, 80, 50),
- AaScaleTransform(Me, 0.15 - CType(RenderTransform, ScaleTransform).ScaleX, 400, 50, New AniEaseOutBack),
- AaScaleTransform(Me, 0.85, 160, 50, New AniEaseOutFluent(AniEasePower.Middle))
- }, "MyExtraTextButton MainScale " & Uuid)
- Else
- '没了
- AniStart({
- AaOpacity(Me, -Opacity, 50, 50),
- AaScaleTransform(Me, -CType(RenderTransform, ScaleTransform).ScaleX, 100,, New AniEaseInFluent(AniEasePower.Weak))
- }, "MyExtraTextButton MainScale " & Uuid)
- End If
- IsHitTestVisible = value '防止缩放动画中依然可以点进去
- End Sub)
- End Set
- End Property
- '触发点击事件
- Private Sub Button_LeftMouseUp(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseLeftButtonUp
- If Not IsLeftMouseHeld Then Return
- Log("[Control] 按下附加图标按钮:" & Text)
- RaiseEvent Click(sender, e)
- e.Handled = True
- RaiseCustomEvent()
- Button_LeftMouseUp()
- End Sub
- '鼠标点击判定(务必放在点击事件之后,以使得 Button_MouseUp 先于 Button_MouseLeave 执行)
- Private IsLeftMouseHeld As Boolean = False
- Private Sub Button_LeftMouseDown(sender As Object, e As MouseButtonEventArgs) Handles PanClick.MouseLeftButtonDown
- If Not IsLeftMouseHeld Then
- AniStart({
- AaScaleTransform(PanScale, 0.85 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
- AaScaleTransform(PanScale, -0.05, 60,, New AniEaseOutFluent)
- }, "MyExtraTextButton Scale " & Uuid)
- End If
- IsLeftMouseHeld = True
- Focus()
- End Sub
- Private Sub Button_LeftMouseUp() Handles PanClick.MouseLeftButtonUp
- AniStart({
- AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 300,, New AniEaseOutBack)
- }, "MyExtraTextButton Scale " & Uuid)
- IsLeftMouseHeld = False
- RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
- End Sub
- Private Sub Button_RightMouseUp() Handles PanClick.MouseRightButtonUp
- If Not IsLeftMouseHeld Then
- AniStart({
- AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 300,, New AniEaseOutBack)
- }, "MyExtraTextButton Scale " & Uuid)
- End If
- RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
- End Sub
- Private Sub Button_MouseLeave() Handles PanClick.MouseLeave
- IsLeftMouseHeld = False
- AniStart({
- AaScaleTransform(PanScale, 1 - CType(PanScale.RenderTransform, ScaleTransform).ScaleX, 500,, New AniEaseOutFluent)
- }, "MyExtraTextButton Scale " & Uuid)
- RefreshColor() '直接刷新颜色以判断是否已触发 MouseLeave
- End Sub
- '自定义事件
- '务必放在 IsMouseDown 更新之后
- Private Const AnimationColorIn As Integer = 120
- Private Const AnimationColorOut As Integer = 150
- Public Sub RefreshColor() Handles PanClick.MouseEnter, PanClick.MouseLeave, Me.Loaded, Me.IsEnabledChanged
- Try
- If IsLoaded AndAlso AniControlEnabled = 0 Then '防止默认属性变更触发动画
- If Not IsEnabled Then
- '禁用
- AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrushGray4", AnimationColorIn), "MyExtraTextButton Color " & Uuid)
- ElseIf IsMouseOver Then
- '指向
- AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrush4", AnimationColorIn), "MyExtraTextButton Color " & Uuid)
- Else
- '普通
- AniStart(AaColor(PanColor, BackgroundProperty, "ColorBrush3", AnimationColorOut), "MyExtraTextButton Color " & Uuid)
- End If
- Else
- AniStop("MyExtraTextButton Color " & Uuid)
- If Not IsEnabled Then
- PanColor.SetResourceReference(BackgroundProperty, "ColorBrushGray4")
- ElseIf IsMouseOver Then
- PanColor.SetResourceReference(BackgroundProperty, "ColorBrush4")
- Else
- PanColor.SetResourceReference(BackgroundProperty, "ColorBrush3")
- End If
- End If
- Catch ex As Exception
- Log(ex, "刷新附加图标按钮颜色出错")
- End Try
- End Sub
- End Class
|