Radiobox.xaml.vb 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. Public Class Radiobox
  2. Public Event Change(ByVal sender As Object, ByVal raiseByMouse As Boolean)
  3. '自定义属性
  4. Private _Checked As Boolean = False '是否选中
  5. Public Property Checked As Boolean
  6. Get
  7. Return _Checked
  8. End Get
  9. Set(ByVal value As Boolean)
  10. SetChecked(value, False)
  11. End Set
  12. End Property
  13. Public Sub SetChecked(ByVal value As Boolean, ByVal raiseByHand As Boolean)
  14. If Not value = _Checked Then '只有变更时才执行
  15. _Checked = value
  16. If Me.IsLoaded Then '防止默认属性加载时导致错误
  17. RaiseEvent Change(Me, raiseByHand)
  18. '同一容器中保证只有1个单选框选中
  19. Dim parentControl As Object = Me.Parent
  20. If IsNothing(parentControl) Then Exit Sub
  21. Dim checkedControl As ArrayList = New ArrayList
  22. Dim checkedCount As Byte = 0
  23. '统计单选框控件与选中个数
  24. For Each con In parentControl.Children
  25. If con.GetType.Name = "Radiobox" Then
  26. checkedControl.Add(con)
  27. If con.Checked Then checkedCount = checkedCount + 1
  28. End If
  29. Next
  30. Select Case checkedCount
  31. Case 0 '没有选中项目
  32. checkedControl(0).Checked = True
  33. Case Is > 1 '选中项目多于1个
  34. If Me.Checked Then
  35. '如果本控件选中则取消其它所有控件的选中
  36. For Each con As Radiobox In checkedControl
  37. If con.Checked And Not con.Equals(Me) Then con.Checked = False
  38. Next
  39. Else
  40. '如果本控件未选中则只保留第一个选中的控件
  41. checkedCount = False '重复使用变量,实则统计是否为第一个选中控件
  42. For Each con As Radiobox In checkedControl
  43. If con.Checked Then
  44. If checkedCount Then
  45. con.Checked = False '修改Checked会自动触发Change事件,所以不用额外触发
  46. Else
  47. checkedCount = True
  48. End If
  49. End If
  50. Next
  51. End If
  52. End Select
  53. End If
  54. If Me.IsLoaded And UseControlAnimation Then '防止默认属性变更触发动画
  55. If _Checked Then
  56. AniStop("Ra" & Me.Name & "CheckedChange")
  57. AniStart({
  58. AaScale(border, 4 / border.Width - 1, 140),
  59. AaOpacity(inner, 1 - inner.Opacity, 1, , , True),
  60. AaScale(inner, 10 - inner.Width, 140, , , , True),
  61. AaScale(border, 14 / border.Width, 140)
  62. }, "Ra" & Me.Name & "CheckedChange")
  63. Else
  64. AniStop("Ra" & Me.Name & "CheckedChange")
  65. AniStart({
  66. AaScale(border, 4 / border.Width - 1, 140),
  67. AaScale(inner, 4 - inner.Width, 40, 100, , , True),
  68. AaOpacity(inner, -inner.Opacity, 1, , , True),
  69. AaScale(border, 14 / border.Width, 140)
  70. }, "Ra" & Me.Name & "CheckedChange")
  71. End If
  72. Else
  73. inner.Opacity = If(_Checked, 1, 0)
  74. End If
  75. End If
  76. End Sub
  77. Public Property Context As String
  78. Get
  79. Return label.Content
  80. End Get
  81. Set(ByVal value As String)
  82. label.Content = value
  83. End Set
  84. End Property '内容
  85. '自定义事件
  86. Public Sub RaiseChange()
  87. RaiseEvent Change(Me, False)
  88. End Sub '用于其它控件来引发本控件的Change事件
  89. '默认事件
  90. Private Sub Radiobox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Me.MouseLeftButtonDown
  91. SetChecked(True, True)
  92. End Sub
  93. Private Sub Radiobox_IsEnabledChanged(ByVal sender As Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs) Handles Me.IsEnabledChanged
  94. If Me.IsLoaded And UseControlAnimation Then '防止默认属性变更触发动画
  95. If Me.IsEnabled Then
  96. AniStop("Ra" & Me.Name & "PointChange")
  97. AniStart({
  98. AaBorderBrush(border, New MyColor(50, 50, 50) - border.BorderBrush, 150),
  99. AaStroke(inner, New MyColor(50, 50, 50) - inner.Stroke, 150),
  100. AaForeGround(label, New MyColor(50, 50, 50) - label.Foreground, 150)
  101. }, "Ra" & Me.Name & "PointChange")
  102. Else
  103. AniStop("Ra" & Me.Name & "PointChange")
  104. AniStart({
  105. AaBorderBrush(border, New MyColor(145, 145, 145) - border.BorderBrush, 150),
  106. AaStroke(inner, New MyColor(145, 145, 145) - inner.Stroke, 150),
  107. AaForeGround(label, New MyColor(145, 145, 145) - label.Foreground, 150)
  108. }, "Ra" & Me.Name & "PointChange")
  109. End If
  110. Else
  111. If Me.IsEnabled Then
  112. inner.Stroke = New MyColor(50, 50, 50)
  113. border.BorderBrush = New MyColor(50, 50, 50)
  114. label.Foreground = New MyColor(50, 50, 50)
  115. Else
  116. inner.Stroke = New MyColor(145, 145, 145)
  117. border.BorderBrush = New MyColor(145, 145, 145)
  118. label.Foreground = New MyColor(145, 145, 145)
  119. End If
  120. End If
  121. End Sub
  122. '鼠标指向
  123. Private Sub Radiobox_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnter
  124. If Me.Name = "" Then Me.Name = "Radio" & GetUUID()
  125. AniStop("Ra" & Me.Name & "PointChange")
  126. AniStart({
  127. AaOpacity(panMain, 1 - panMain.Opacity, 200)
  128. }, "Ra" & Me.Name & "PointChange")
  129. End Sub
  130. Private Sub Radiobox_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeave
  131. 'MouseLeave比IsEnabledChanged后执行,所以如果自定义事件修改了IsEnabled,将导致颜色显示错误,这个判断语句为了修复此bug
  132. If Me.IsEnabled Then
  133. AniStop("Ra" & Me.Name & "PointChange")
  134. AniStart({
  135. AaOpacity(panMain, 0.8 - panMain.Opacity, 200)
  136. }, "Ra" & Me.Name & "PointChange")
  137. End If
  138. End Sub
  139. End Class