Checkbox.xaml.vb 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. Public Class Checkbox
  2. Public Event Change(ByVal sender As Object, ByVal raiseByMouse As Boolean)
  3. '自定义属性
  4. Private _Checked As Boolean = True '是否选中
  5. Public Property Checked As Boolean
  6. Get
  7. Return _Checked
  8. End Get
  9. Set(ByVal value As Boolean)
  10. If Not value = _Checked Then '只有改变了才触发
  11. _Checked = value
  12. If Me.IsLoaded Then RaiseEvent Change(Me, False) 'Change事件只在控件加载后触发,以防止默认属性设置触发事件
  13. If Me.IsLoaded And UseControlAnimation Then '防止默认属性设置触发动画
  14. Refresh()
  15. Else
  16. Check.Opacity = If(_Checked, 1, 0)
  17. End If
  18. End If
  19. End Set
  20. End Property
  21. Public Property Context As String
  22. Get
  23. Return label.Content
  24. End Get
  25. Set(ByVal value As String)
  26. label.Content = value
  27. End Set
  28. End Property '内容
  29. '自定义事件
  30. Private Sub Refresh()
  31. 'Checked变更
  32. If _Checked Then
  33. AniStop("Ch" & Me.Name & "CheckedChange") '停止旧动画实行相对动画
  34. AniStart({
  35. AaScale(border, 4 / border.Width - 1, 150),
  36. AaOpacity(Check, 1 - Check.Opacity, 1, , , True),
  37. AaX(imgBlack, -14 - imgBlack.Margin.Left, 1),
  38. AaY(imgBlack, -14 - imgBlack.Margin.Left, 1),
  39. AaX(imgBlue, -14 - imgBlue.Margin.Left, 1),
  40. AaY(imgBlue, -14 - imgBlue.Margin.Left, 1),
  41. AaX(imgGray, -14 - imgGray.Margin.Left, 1),
  42. AaY(imgGray, -14 - imgGray.Margin.Left, 1),
  43. AaX(imgBlack, 14, 150, , , True),
  44. AaY(imgBlack, 14, 150),
  45. AaX(imgBlue, 14, 150),
  46. AaY(imgBlue, 14, 150),
  47. AaX(imgGray, 14, 150),
  48. AaY(imgGray, 14, 150),
  49. AaScale(border, 14 / border.Width, 150)
  50. }, "Ch" & Me.Name & "CheckedChange")
  51. Else
  52. AniStop("Ch" & Me.Name & "CheckedChange")
  53. AniStart({ _
  54. AaX(imgBlack, imgBlack.Margin.Left - 14, 150),
  55. AaY(imgBlack, imgBlack.Margin.Left - 14, 150),
  56. AaX(imgBlue, imgBlue.Margin.Left - 14, 150),
  57. AaY(imgBlue, imgBlue.Margin.Left - 14, 150),
  58. AaX(imgGray, imgGray.Margin.Left - 14, 150),
  59. AaY(imgGray, imgGray.Margin.Left - 14, 150),
  60. AaScale(border, 4 / border.Width - 1, 150),
  61. AaOpacity(Check, -Check.Opacity, 1, , , True),
  62. AaScale(border, 14 / border.Width, 150) _
  63. }, "Ch" & Me.Name & "CheckedChange")
  64. End If
  65. End Sub
  66. '默认事件
  67. Private Sub Checkbox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Me.MouseDown
  68. _Checked = Not _Checked
  69. If Me.IsLoaded Then
  70. RaiseEvent Change(Me, True) 'Change事件只在控件加载后触发,以防止默认属性设置触发事件
  71. Refresh()
  72. Else
  73. Check.Opacity = If(_Checked, 1, 0)
  74. End If
  75. End Sub
  76. Private Sub Checkbox_IsEnabledChanged(ByVal sender As Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs) Handles Me.IsEnabledChanged
  77. If Me.IsLoaded And UseControlAnimation Then '防止默认属性设置触发动画
  78. If Me.IsEnabled Then
  79. AniStop("Ch" & Me.Name & "PointChange")
  80. AniStart({
  81. AaOpacity(imgBlack, 1 - imgBlack.Opacity, 150),
  82. AaBorderBrush(border, New MyColor(50, 50, 50) - border.BorderBrush, 150),
  83. AaForeGround(Me, New MyColor(50, 50, 50) - Me.Foreground, 150),
  84. AaOpacity(imgBlue, -imgBlue.Opacity, 150, 50),
  85. AaOpacity(imgGray, -imgGray.Opacity, 150, 50)
  86. }, "Ch" & Me.Name & "PointChange")
  87. Else
  88. AniStop("Ch" & Me.Name & "PointChange")
  89. AniStart({
  90. AaOpacity(imgGray, 1 - imgGray.Opacity, 150),
  91. AaBorderBrush(border, New MyColor(145, 145, 145) - border.BorderBrush, 150),
  92. AaForeGround(Me, New MyColor(145, 145, 145) - Me.Foreground, 150),
  93. AaOpacity(imgBlue, -imgBlue.Opacity, 150, 50),
  94. AaOpacity(imgBlack, -imgBlack.Opacity, 150, 50)
  95. }, "Ch" & Me.Name & "PointChange")
  96. End If
  97. Else
  98. If Me.IsEnabled Then
  99. imgGray.Opacity = 0
  100. imgBlack.Opacity = 1
  101. border.BorderBrush = New MyColor(50, 50, 50)
  102. Me.Foreground = New MyColor(50, 50, 50)
  103. Else
  104. imgGray.Opacity = 1
  105. imgBlack.Opacity = 0
  106. border.BorderBrush = New MyColor(145, 145, 145)
  107. Me.Foreground = New MyColor(145, 145, 145)
  108. End If
  109. End If
  110. End Sub
  111. '鼠标指向
  112. Private Sub Checkbox_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnter
  113. If Me.Name = "" Then Me.Name = "Check" & GetUUID()
  114. AniStop("Ch" & Me.Name & "PointChange")
  115. AniStart({
  116. AaOpacity(panMain, 1 - panMain.Opacity, 200)
  117. }, "Ch" & Me.Name & "PointChange")
  118. End Sub
  119. Private Sub Checkbox_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeave
  120. 'MouseLeave比IsEnabledChanged后执行,所以如果自定义事件修改了IsEnabled,将导致颜色显示错误,这个判断语句为了修复此bug
  121. If Me.IsEnabled Then
  122. AniStop("Ch" & Me.Name & "PointChange")
  123. AniStart({
  124. AaOpacity(panMain, 0.8 - panMain.Opacity, 200)
  125. }, "Ch" & Me.Name & "PointChange")
  126. End If
  127. End Sub
  128. End Class