📄 xpanderlist.vb
字号:
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Runtime.CompilerServices
Imports System.Windows.Forms
<DesignTimeVisible(True), Designer(GetType(XPanderListDesigner))> _
Public Class XPanderList
Inherits UserControl
' Methods
Shared Sub New()
XPanderList.c_LightBackColor = Color.FromArgb(123, 162, 239)
XPanderList.c_DarkBackColor = Color.FromArgb(99, 117, 222)
End Sub
Public Sub New()
AddHandler MyBase.Load, New EventHandler(AddressOf Me.XPanderList_Load)
AddHandler MyBase.SizeChanged, New EventHandler(AddressOf Me.XPanderList_SizeChanged)
Me.m_BgColorLight = XPanderList.c_LightBackColor
Me.m_BgColorDark = XPanderList.c_DarkBackColor
Me.m_ControlList = New SortedList(Me.m_XPanderComparer)
Me.m_NextControlKey = 0
Me.InitializeComponent()
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.SetStyle(ControlStyles.ResizeRedraw, False)
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
End Sub
Public Sub ControlCollapsed(ByVal x As XPander)
Dim enumerator1 As IDictionaryEnumerator = Me.m_ControlList.GetEnumerator
Do While enumerator1.MoveNext
Dim control1 As Control = DirectCast(enumerator1.Value, Control)
If (control1.Top > x.Top) Then
Dim control2 As Control = control1
control2.Top = (control2.Top - (x.ExpandedHeight - x.CaptionHeight))
End If
Loop
End Sub
Public Sub ControlCollapsing(ByVal x As XPander, ByVal delta As Integer)
Dim enumerator1 As IDictionaryEnumerator = Me.m_ControlList.GetEnumerator
Do While enumerator1.MoveNext
Dim control1 As Control = DirectCast(enumerator1.Value, Control)
If (control1.Top > x.Top) Then
Dim control2 As Control = control1
control2.Top = (control2.Top - delta)
End If
Loop
End Sub
Public Sub ControlExpanded(ByVal x As XPander)
Dim enumerator1 As IDictionaryEnumerator = Me.m_ControlList.GetEnumerator
Do While enumerator1.MoveNext
Dim control1 As Control = DirectCast(enumerator1.Value, Control)
If (control1.Top > x.Top) Then
Dim control2 As Control = control1
control2.Top = (control2.Top + (x.ExpandedHeight - x.CaptionHeight))
End If
Loop
End Sub
Public Sub ControlExpanding(ByVal x As XPander, ByVal delta As Integer)
Dim enumerator1 As IDictionaryEnumerator = Me.m_ControlList.GetEnumerator
Do While enumerator1.MoveNext
Dim control1 As Control = DirectCast(enumerator1.Value, Control)
If (control1.Top > x.Top) Then
Dim control2 As Control = control1
control2.Top = (control2.Top + delta)
End If
Loop
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If (disposing AndAlso (Not Me.components Is Nothing)) Then
Me.components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
Private Function FixRGB(ByVal RGBValue As Integer) As Integer
If ((RGBValue >= 0) And (RGBValue <= 255)) Then
Return RGBValue
End If
If (RGBValue < 0) Then
Return 0
End If
Return 255
End Function
Private Function GetNextTopPosition() As Integer
Dim num2 As Integer = 10
Dim num3 As Integer = 0
Dim enumerator1 As IDictionaryEnumerator = Me.m_ControlList.GetEnumerator
Do While enumerator1.MoveNext
Dim control1 As Control = DirectCast(enumerator1.Value, Control)
num3 = (control1.Top + control1.Height)
If (num3 > num2) Then
num2 = num3
End If
Loop
If (num2 <> 10) Then
num2 = (num2 + 14)
End If
Return num2
End Function
<DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.AutoScroll = True
Me.Name = "XPanderList"
End Sub
Protected Overrides Sub OnControlAdded(ByVal e As ControlEventArgs)
MyBase.OnControlAdded(e)
If (e.Control.GetType Is GetType(XPander)) Then
If (e.Control.Width <= Me.Width) Then
e.Control.Left = 8
e.Control.Width = (Me.Width - 16)
e.Control.Top = Me.GetNextTopPosition
e.Control.Anchor = (AnchorStyles.Right Or (AnchorStyles.Left Or AnchorStyles.Top))
End If
Dim pander1 As XPander = DirectCast(e.Control, XPander)
AddHandler pander1.XPanderCollapsed, New XPander.XPanderCollapsedHandler(AddressOf Me.ControlCollapsed)
AddHandler pander1.XPanderExpanded, New XPander.XPanderExpandedHandler(AddressOf Me.ControlExpanded)
e.Control.Tag = Me.m_NextControlKey
Me.m_NextControlKey += 1
Me.m_ControlList.Add(RuntimeHelpers.GetObjectValue(e.Control.Tag), e.Control)
End If
End Sub
Protected Overrides Sub OnControlRemoved(ByVal e As ControlEventArgs)
Dim num2 As Integer = e.Control.Top
Dim num1 As Integer = 0
If (e.Control.GetType Is GetType(XPander)) Then
Dim enumerator1 As IDictionaryEnumerator = Me.m_ControlList.GetEnumerator
Do While enumerator1.MoveNext
Dim control1 As Control = DirectCast(enumerator1.Value, Control)
If (control1.Top > num2) Then
num1 = num2
num2 = control1.Top
control1.Top = num1
End If
Loop
Dim pander1 As XPander = DirectCast(e.Control, XPander)
RemoveHandler pander1.XPanderCollapsed, New XPander.XPanderCollapsedHandler(AddressOf Me.ControlCollapsed)
RemoveHandler pander1.XPanderExpanded, New XPander.XPanderExpandedHandler(AddressOf Me.ControlExpanded)
Me.m_ControlList.Remove(RuntimeHelpers.GetObjectValue(e.Control.Tag))
End If
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
Dim rectangle1 As New Rectangle(0, 0, Me.Width, Me.Height)
Dim brush1 As New LinearGradientBrush(rectangle1, Me.m_BgColorLight, Me.m_BgColorDark, LinearGradientMode.Vertical)
e.Graphics.FillRectangle(brush1, rectangle1)
End Sub
Private Sub XPanderList_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.BackColor = Me.m_BgColorDark
Me.m_NextControlKey = Me.m_ControlList.Count
End Sub
Private Sub XPanderList_SizeChanged(ByVal sender As Object, ByVal e As EventArgs)
Me.Invalidate()
End Sub
' Properties
<DefaultValue("99,117,222"), Category("Appearance"), Description("Dark color used in gradient for background.")> _
Public Property BackColorDark() As Color
Get
Return Me.m_BgColorDark
End Get
Set(ByVal Value As Color)
Me.m_BgColorDark = Value
Me.Invalidate()
End Set
End Property
<Description("Light color used in gradient for background."), Category("Appearance"), DefaultValue("123,162,239")> _
Public Property BackColorLight() As Color
Get
Return Me.m_BgColorLight
End Get
Set(ByVal Value As Color)
Me.m_BgColorLight = Value
Me.Invalidate()
End Set
End Property
' Fields
Private Shared ReadOnly c_DarkBackColor As Color
Private Const c_HorizontalSpacing As Integer = 8
Private Const c_InitialVerticalSpacing As Integer = 10
Private Shared ReadOnly c_LightBackColor As Color
Private Const c_VerticalSpacing As Integer = 14
Private components As IContainer
Private m_BgColorDark As Color
Private m_BgColorLight As Color
Private m_ControlList As SortedList
Private m_NextControlKey As Integer
Private m_XPanderComparer As XPanderComparer
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -