| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- Public Class Checkbox
- Public Event Change(ByVal sender As Object, ByVal raiseByMouse As Boolean)
- '自定义属性
- Private _Checked As Boolean = True '是否选中
- Public Property Checked As Boolean
- Get
- Return _Checked
- End Get
- Set(ByVal value As Boolean)
- If Not value = _Checked Then '只有改变了才触发
- _Checked = value
- If Me.IsLoaded Then RaiseEvent Change(Me, False) 'Change事件只在控件加载后触发,以防止默认属性设置触发事件
- If Me.IsLoaded And UseControlAnimation Then '防止默认属性设置触发动画
- Refresh()
- Else
- Check.Opacity = If(_Checked, 1, 0)
- End If
- End If
- End Set
- End Property
- Public Property Context As String
- Get
- Return label.Content
- End Get
- Set(ByVal value As String)
- label.Content = value
- End Set
- End Property '内容
- '自定义事件
- Private Sub Refresh()
- 'Checked变更
- If _Checked Then
- AniStop("Ch" & Me.Name & "CheckedChange") '停止旧动画实行相对动画
- AniStart({
- AaScale(border, 4 / border.Width - 1, 150),
- AaOpacity(Check, 1 - Check.Opacity, 1, , , True),
- AaX(imgBlack, -14 - imgBlack.Margin.Left, 1),
- AaY(imgBlack, -14 - imgBlack.Margin.Left, 1),
- AaX(imgBlue, -14 - imgBlue.Margin.Left, 1),
- AaY(imgBlue, -14 - imgBlue.Margin.Left, 1),
- AaX(imgGray, -14 - imgGray.Margin.Left, 1),
- AaY(imgGray, -14 - imgGray.Margin.Left, 1),
- AaX(imgBlack, 14, 150, , , True),
- AaY(imgBlack, 14, 150),
- AaX(imgBlue, 14, 150),
- AaY(imgBlue, 14, 150),
- AaX(imgGray, 14, 150),
- AaY(imgGray, 14, 150),
- AaScale(border, 14 / border.Width, 150)
- }, "Ch" & Me.Name & "CheckedChange")
- Else
- AniStop("Ch" & Me.Name & "CheckedChange")
- AniStart({ _
- AaX(imgBlack, imgBlack.Margin.Left - 14, 150),
- AaY(imgBlack, imgBlack.Margin.Left - 14, 150),
- AaX(imgBlue, imgBlue.Margin.Left - 14, 150),
- AaY(imgBlue, imgBlue.Margin.Left - 14, 150),
- AaX(imgGray, imgGray.Margin.Left - 14, 150),
- AaY(imgGray, imgGray.Margin.Left - 14, 150),
- AaScale(border, 4 / border.Width - 1, 150),
- AaOpacity(Check, -Check.Opacity, 1, , , True),
- AaScale(border, 14 / border.Width, 150) _
- }, "Ch" & Me.Name & "CheckedChange")
- End If
- End Sub
- '默认事件
- Private Sub Checkbox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Me.MouseDown
- _Checked = Not _Checked
- If Me.IsLoaded Then
- RaiseEvent Change(Me, True) 'Change事件只在控件加载后触发,以防止默认属性设置触发事件
- Refresh()
- Else
- Check.Opacity = If(_Checked, 1, 0)
- End If
- End Sub
- Private Sub Checkbox_IsEnabledChanged(ByVal sender As Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs) Handles Me.IsEnabledChanged
- If Me.IsLoaded And UseControlAnimation Then '防止默认属性设置触发动画
- If Me.IsEnabled Then
- AniStop("Ch" & Me.Name & "PointChange")
- AniStart({
- AaOpacity(imgBlack, 1 - imgBlack.Opacity, 150),
- AaBorderBrush(border, New MyColor(50, 50, 50) - border.BorderBrush, 150),
- AaForeGround(Me, New MyColor(50, 50, 50) - Me.Foreground, 150),
- AaOpacity(imgBlue, -imgBlue.Opacity, 150, 50),
- AaOpacity(imgGray, -imgGray.Opacity, 150, 50)
- }, "Ch" & Me.Name & "PointChange")
- Else
- AniStop("Ch" & Me.Name & "PointChange")
- AniStart({
- AaOpacity(imgGray, 1 - imgGray.Opacity, 150),
- AaBorderBrush(border, New MyColor(145, 145, 145) - border.BorderBrush, 150),
- AaForeGround(Me, New MyColor(145, 145, 145) - Me.Foreground, 150),
- AaOpacity(imgBlue, -imgBlue.Opacity, 150, 50),
- AaOpacity(imgBlack, -imgBlack.Opacity, 150, 50)
- }, "Ch" & Me.Name & "PointChange")
- End If
- Else
- If Me.IsEnabled Then
- imgGray.Opacity = 0
- imgBlack.Opacity = 1
- border.BorderBrush = New MyColor(50, 50, 50)
- Me.Foreground = New MyColor(50, 50, 50)
- Else
- imgGray.Opacity = 1
- imgBlack.Opacity = 0
- border.BorderBrush = New MyColor(145, 145, 145)
- Me.Foreground = New MyColor(145, 145, 145)
- End If
- End If
- End Sub
- '鼠标指向
- Private Sub Checkbox_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnter
- If Me.Name = "" Then Me.Name = "Check" & GetUUID()
- AniStop("Ch" & Me.Name & "PointChange")
- AniStart({
- AaOpacity(panMain, 1 - panMain.Opacity, 200)
- }, "Ch" & Me.Name & "PointChange")
- End Sub
- Private Sub Checkbox_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeave
- 'MouseLeave比IsEnabledChanged后执行,所以如果自定义事件修改了IsEnabled,将导致颜色显示错误,这个判断语句为了修复此bug
- If Me.IsEnabled Then
- AniStop("Ch" & Me.Name & "PointChange")
- AniStart({
- AaOpacity(panMain, 0.8 - panMain.Opacity, 200)
- }, "Ch" & Me.Name & "PointChange")
- End If
- End Sub
- End Class
|