Selecter.xaml.vb 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. Public Class Selecter
  2. Public Event SelectionChange(ByVal Selection As String)
  3. Public Event Click(ByVal Selection As String, ByVal Index As Integer)
  4. Public NowSelect As New Label
  5. #Region "属性"
  6. '线条宽度
  7. Public Property LineWidth As Integer
  8. Get
  9. Return lineSelect.Width
  10. End Get
  11. Set(ByVal value As Integer)
  12. lineSelect.Width = value
  13. End Set
  14. End Property
  15. '显示的选项
  16. Private _ShowList As Object() = {}
  17. Public Property ShowList As Object()
  18. Get
  19. Return _ShowList
  20. End Get
  21. Set(ByVal value As Object())
  22. If _ShowList.Equals(value) Then Exit Property
  23. _ShowList = value
  24. Try
  25. panLabs.Children.Clear() '清空已有选项
  26. Dim i = 0
  27. For Each selection As String In value
  28. '每个选项
  29. Dim newLabel As New Label With {.Padding = New Thickness(0), .Name = "LabSelect" & GetUUID(), .Content = selection, .Height = 32, .HorizontalContentAlignment = HorizontalAlignment.Left, .VerticalContentAlignment = VerticalAlignment.Center, .Background = New MyColor(1, 200, 200, 200), .Opacity = 0.5, .FontSize = panBack.FontSize}
  30. newLabel.SetBinding(Control.ForegroundProperty, New Binding("Foreground") With {.ElementName = "panBack"})
  31. If HintList.Length > i Then newLabel.ToolTip = HintList(i)
  32. AddHandler newLabel.MouseEnter, AddressOf LabMouseEnter
  33. AddHandler newLabel.MouseLeave, AddressOf LabMouseLeave
  34. AddHandler newLabel.MouseUp, AddressOf LabMouseUp
  35. '添加Label
  36. panLabs.Children.Add(newLabel)
  37. i = i + 1
  38. Next
  39. NowSelect = panLabs.Children(0)
  40. SelectIndex = 0
  41. AniStop(Me.Name)
  42. NowSelect.Opacity = 1
  43. SetTop(lineSelect, 4)
  44. panLabs.IsHitTestVisible = True
  45. Catch ex As Exception
  46. ExShow(ex, "设置选择条选项失败", ErrorLevel.MsgboxAndFeedback)
  47. End Try
  48. End Set
  49. End Property
  50. '选择选项
  51. Public SelectIndexName As String = ""
  52. Private _SelectIndex As Byte = 0
  53. Public Property SelectIndex As Byte
  54. Get
  55. Return _SelectIndex
  56. End Get
  57. Set(ByVal value As Byte)
  58. Try
  59. value = MathRange(value, 0, panLabs.Children.Count - 1)
  60. Dim sender As Label = panLabs.Children(value)
  61. If sender.Content.Equals(SelectIndexName) Then Exit Property
  62. SelectIndexName = sender.Content
  63. If If(IsNothing(Me.Name), True, Me.Name = "selecter") Then Me.Name = "selecter" & GetUUID()
  64. '动画
  65. panLabs.IsHitTestVisible = False
  66. Dim AnimationList As New ArrayList
  67. For Each Lab As Label In panLabs.Children
  68. AniStart({AaOpacity(Lab, If(Lab.Equals(sender), 1, 0.5) - Lab.Opacity, 100)}, Lab.Name, False)
  69. Next
  70. AnimationList.Add(AaY(lineSelect, 4 + panLabs.Children.IndexOf(sender) * 32 - lineSelect.Margin.Top, , , New AniEaseJumpEnd(0.7)))
  71. AnimationList.Add(AaCode({"IsHitTestVisible", panLabs, True}, , True))
  72. AniStart(AnimationList, Me.Name)
  73. '切换选项
  74. NowSelect = sender
  75. '引发事件
  76. _SelectIndex = panLabs.Children.IndexOf(sender)
  77. RaiseEvent SelectionChange(NowSelect.Content)
  78. Catch ex As Exception
  79. ExShow(ex, "切换选择条选项失败", ErrorLevel.MsgboxAndFeedback)
  80. End Try
  81. End Set
  82. End Property
  83. '点击可以改变
  84. Public Property ClickToChange As Boolean = True
  85. '各个选项的指向提示
  86. Public Property HintList As String() = {}
  87. #End Region
  88. Private Sub LabMouseEnter(ByVal sender As Label, ByVal e As System.Windows.Input.MouseEventArgs)
  89. If Not NowSelect.Equals(sender) Then
  90. AniStart({AaOpacity(sender, 0.8 - sender.Opacity, 70)}, sender.Name)
  91. End If
  92. End Sub
  93. Private Sub LabMouseLeave(ByVal sender As Label, ByVal e As System.Windows.Input.MouseEventArgs)
  94. If Not NowSelect.Equals(sender) Then
  95. AniStart({AaOpacity(sender, 0.5 - sender.Opacity, 70)}, sender.Name)
  96. End If
  97. End Sub
  98. Private Sub LabMouseUp(ByVal sender As Label, ByVal e As System.Windows.Input.MouseButtonEventArgs)
  99. If ClickToChange And Not NowSelect.Equals(sender) Then SelectIndex = panLabs.Children.IndexOf(sender)
  100. RaiseEvent Click(sender.Content, panLabs.Children.IndexOf(sender))
  101. End Sub
  102. End Class