ListItem.xaml.vb 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. Public Class ListItem
  2. Public Event Click(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) '单击事件
  3. Public Event Change(ByVal sender As Object, ByVal e As EventArgs) '选择改变事件
  4. Public Event ButtonClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) '按钮按下事件
  5. Public Event IconClick(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) '图标按下事件
  6. #Region "自定义属性"
  7. Private _CanCheck As Boolean = True
  8. Public Property CanCheck As Boolean
  9. Get
  10. Return _CanCheck
  11. End Get
  12. Set(ByVal value As Boolean)
  13. _CanCheck = value
  14. Checked = False
  15. End Set
  16. End Property '能否选中
  17. Private _Checked As Boolean = False
  18. Public Property Checked As Boolean
  19. Get
  20. Return _Checked
  21. End Get
  22. Set(ByVal value As Boolean)
  23. If Not value = _Checked Then '只有变更时才执行
  24. _Checked = value
  25. If Me.IsLoaded Then '防止默认属性加载时导致错误
  26. RaiseChange()
  27. '同一容器中保证只有1个单选框选中
  28. Dim parentControl As Object = Me.Parent
  29. Dim checkedControl As ArrayList = New ArrayList
  30. Dim checkedCount As Byte = 0
  31. '统计单选框控件与选中个数
  32. For Each con In parentControl.Children
  33. If con.GetType.Name = "ListItem" Then
  34. checkedControl.Add(con)
  35. If con.Checked Then checkedCount = checkedCount + 1
  36. End If
  37. Next
  38. Select Case checkedCount
  39. Case 0 '没有选中项目
  40. If AtLeastCheck Then checkedControl(0).Checked = True
  41. Case Is > 1 '选中项目多于1个
  42. If Me.Checked Then
  43. '如果本控件选中则取消其它所有控件的选中
  44. For Each con As ListItem In checkedControl
  45. If con.Checked And Not con.Equals(Me) Then con.Checked = False
  46. Next
  47. Else
  48. '如果本控件未选中则只保留第一个选中的控件
  49. checkedCount = False '重复使用变量,实则统计是否为第一个选中控件
  50. For Each con As ListItem In checkedControl
  51. If con.Checked Then
  52. If checkedCount Then
  53. con.Checked = False '修改Checked会自动触发Change事件,所以不用额外触发
  54. Else
  55. checkedCount = True
  56. End If
  57. End If
  58. Next
  59. End If
  60. End Select
  61. End If
  62. Refresh()
  63. End If
  64. End Set
  65. End Property '是否选中
  66. Private _ShowButton As Boolean = True
  67. Public Property ShowButton As Boolean
  68. Get
  69. Return _ShowButton
  70. End Get
  71. Set(ByVal value As Boolean)
  72. If Not value = _ShowButton Then '只有变更时才执行
  73. _ShowButton = value
  74. border.Visibility = If(value, Visibility.Visible, Visibility.Hidden)
  75. If _ShowButton = False Then ListItem_MouseLeave(Nothing, Nothing)
  76. End If
  77. End Set
  78. End Property '是否显示按钮
  79. Public Property MainText As String
  80. Get
  81. Return labMain.Content
  82. End Get
  83. Set(ByVal value As String)
  84. labMain.Content = value
  85. End Set
  86. End Property '主内容
  87. Public Property SubText As String
  88. Get
  89. Return labSub.Text
  90. End Get
  91. Set(ByVal value As String)
  92. If value = "" Xor labSub.Text = "" Then
  93. If Me.Name = "" Then Me.Name = "ListItem" & GetUUID()
  94. If Me.IsLoaded And UseControlAnimation Then
  95. If value = "" Then
  96. AniStart({
  97. AaY(labMain, (Me.Height - labMain.Height) / 2 - GetTop(labMain), , , New AniEaseEnd)
  98. }, "Li" & Me.Name & "Sub")
  99. Else
  100. AniStart({
  101. AaY(labMain, -GetTop(labMain), , , New AniEaseEnd)
  102. }, "Li" & Me.Name & "Sub")
  103. End If
  104. Else
  105. If value = "" Then
  106. SetTop(labMain, (Me.Height - labMain.Height) / 2)
  107. Else
  108. SetTop(labMain, 0)
  109. End If
  110. End If
  111. End If
  112. labSub.Text = value
  113. End Set
  114. End Property '副内容
  115. Public Property Logo As ImageSource
  116. Get
  117. Return imgLeft.Source
  118. End Get
  119. Set(ByVal value As ImageSource)
  120. imgLeft.Source = value
  121. End Set
  122. End Property '图标
  123. Public Property LogoSize As Double
  124. Get
  125. Return imgLeft.Height
  126. End Get
  127. Set(ByVal value As Double)
  128. imgLeft.Height = value
  129. imgLeft.Width = value
  130. End Set
  131. End Property '图标尺寸
  132. Public Property ButtonLogo As ImageSource
  133. Get
  134. Return btnRight.Source
  135. End Get
  136. Set(ByVal value As ImageSource)
  137. btnRight.Source = value
  138. End Set
  139. End Property '按钮图标
  140. Public Property ButtonLogoSize As Double
  141. Get
  142. Return btnRight.Height
  143. End Get
  144. Set(ByVal value As Double)
  145. btnRight.Height = value
  146. btnRight.Width = value
  147. End Set
  148. End Property '按钮图标尺寸
  149. Public Property ButtonBack As Brush
  150. Get
  151. Return border.Background
  152. End Get
  153. Set(ByVal value As Brush)
  154. border.Background = value
  155. End Set
  156. End Property '按钮背景颜色
  157. Public AtLeastCheck As Boolean = True '是否必须有一项被选中
  158. Public Version As New MCVersion("")
  159. #End Region
  160. '自定义事件
  161. Public Sub RaiseChange()
  162. RaiseEvent Change(Me, Nothing)
  163. End Sub '用于其它控件来引发本控件的Change事件
  164. Private Sub Refresh()
  165. Dim shouldOpacity As Double = 0
  166. If Me.IsMouseOver Then shouldOpacity = 0.1
  167. If Me._Checked Then shouldOpacity = shouldOpacity / 2 + 0.14
  168. If shouldOpacity = labBack.Opacity Then
  169. AniStop("Li" & Me.Name & "Refresh")
  170. Exit Sub
  171. End If
  172. AniStart({
  173. AaOpacity(labBack, shouldOpacity - labBack.Opacity, 100)
  174. }, "Li" & Me.Name & "Refresh", False)
  175. End Sub
  176. Private Sub btnRight_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles border.MouseLeftButtonDown
  177. RaiseEvent ButtonClick(Me, e)
  178. End Sub
  179. '系统事件
  180. '改成MouseDown是因为拖动滚动条后在其上释放鼠标会导致点击
  181. Private Sub ListItem_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles mouseCheck.MouseLeftButtonDown
  182. If CanCheck Then
  183. Me.Checked = True
  184. RaiseEvent Click(Me, e)
  185. End If
  186. End Sub
  187. Private Sub imgLeft_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles imgLeft.MouseLeftButtonDown
  188. RaiseEvent IconClick(Me, e)
  189. ListItem_MouseUp(sender, e)
  190. End Sub
  191. Private Sub ListItem_SizeChanged(ByVal sender As Object, ByVal e As System.Windows.SizeChangedEventArgs) Handles Me.SizeChanged
  192. panBack.Width = Me.Width + 0.51 '防止按钮莫名显示越界
  193. SetLeft(border, Me.ActualWidth - 40)
  194. End Sub
  195. Private Sub ListItem_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnter
  196. If ShowButton Then
  197. AniStart({
  198. AaX(border, Me.ActualWidth - 81 - border.Margin.Left, 200, , New AniEaseJumpEnd(0.6))
  199. }, "Li" & Me.Name & "PointChange", False)
  200. End If
  201. Refresh()
  202. End Sub
  203. Private Sub ListItem_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeave
  204. If Me.ActualWidth = 0 Then
  205. '防止初始化加载
  206. Refresh()
  207. Exit Sub
  208. End If
  209. AniStart({
  210. AaX(border, Me.ActualWidth - 40 - border.Margin.Left, 150, , New AniEaseStart)
  211. }, "Li" & Me.Name & "PointChange", False)
  212. Refresh()
  213. End Sub
  214. End Class