VB.NET 中的可折叠面板
在 VB.NET 中实现的展开和折叠面板。
引言
我需要在一个窗体上显示多个具有相关但独立的功能的面板。单独来看,每个面板将包含不同的控件,但每个面板都将与窗体的更大范围相关联。由于每个面板在显示时会占用不同的空间,因此我将限制在一个窗体上可以显示的面板数量,否则窗体会变得过于拥挤和混乱。也就是说,除非面板可以折叠到最小尺寸并重新展开到正常尺寸。我需要可以折叠和展开的面板控件。
背景
当我使用 Microsoft Visio 2003 和 Microsoft Visual Studio 2003 时,我产生了关于可折叠面板的想法。我注意到 Visio 包含了我想要的折叠和展开的侧面板,同样,Visual Studio 提供了一个大纲功能,可以折叠和展开代码区域。我只需要将相同的功能应用于面板。
所以,我知道我想要的功能存在,但我不知道如何实现它,或者是否存在一个控件可以封装它。
在互联网搜索后,我在 Code Project 网站上发现了一些项目
- 可折叠分组框 作者:jeffb42。
- Windows XP 风格的可折叠面板栏 作者:Derek Lakin。
- 功能齐全的 XP 风格可折叠面板 作者:Tom Guinther。
这些都是极好的解决方案,任何一个都可以工作,但 jeffb42 的可折叠分组框和展开面板更适合我的应用程序的需求和展示风格。唯一的问题是我需要 VB.NET 代码,而不是 C#。所以,我必须进行转换。
Jeff 的代码包含一个我不需要的垃圾桶功能,所以当我在转换他的 C# 代码时,我删除了垃圾桶图标和功能。这是一个很棒的想法,为 Jeff 提供该功能点赞,但它对我来说是多余的。我还重命名了项目、文件名和一些方法,以匹配我偏好的术语。
为了证明转换成功,我使用我转换的 VB.NET 代码复制了他的测试应用程序。
此外,我还添加了一个 `Minimize()` 方法,以初始显示面板处于最小化状态。现在,我可以将多个面板以垂直方式显示——像一个列表——在一个窗体上。
每个面板在展开时都会按需滚动。
以垂直方式显示面板并按需展开,满足了我需要在单个窗体上显示许多相关面板而又不影响窗体外观的要求。
Using the Code
再次感谢 jeffb42 在他的文章中提供了出色的文档。我不会试图改进他的文档,但我会总结设置和使用代码所需的步骤。由于代码是作为用户控件构建的,您需要经过一些额外的步骤才能使用它。
首先,将 `CollapsiblePanel` 控件添加到 Visual Studio 的工具箱中。
- 打开一个窗体
- 从工具箱中选择“我的用户控件”
- 右键单击工具箱,然后选择“添加/删除项...”菜单项
- 在“自定义工具箱”对话框显示后,选择“浏览...”按钮,然后导航到包含 CollapsiblePanel.dll 的目录。
- 选择 CollapsiblePanel.dll。
新控件应显示在工具箱中。
注意:您可能需要关闭并重新打开解决方案才能使控件显示。
将 `CollapsiblePanel` 控件添加到工具箱后,创建一个派生自 `CollapseGroupBox` 的类,并向其中添加一些标准的 WinForm 控件。通常,标准的 WinForm 控件会被添加到 `CollapseGroupBox` 中,而 `CollapseGroupBox` 又被添加到 `CollapsePanel` 中。
标准 Winform 控件 -> CollapseGroupBox -> CollapsePanel
- 从解决方案资源管理器中,右键单击项目,然后选择“添加->用户控件…”(或“添加继承控件…”)
- 编辑生成的类。将基类从 `System.Windows.Forms` 更改为 `CollapseGroupBox`
Public Class MyUserControl Inherits CollapseGroupBox
- 保存新的继承控件,然后切换到设计视图。
- 从工具箱中向继承的窗体添加一些标准的 WinForm 控件。保存它。
- 打开项目的 Mian 窗体,然后从工具箱中拖放一个 `CollapsePanel` 控件。
- 编辑主窗体的代码,将(来自上述步骤的)继承类添加到 `CollapsePanel` 中。
Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() CollapsePanel1.Add(new MyUserControl ()) End Sub
- 编译并运行。
关注点
如前所述,我添加了一个 `Minimize()` 方法,以初始显示面板处于最小化状态。
Public Sub Minimize()
要使用它,只需在显示 `CollapseGroupBox` 对象之前调用它。
Dim myControl As MyUserControl = New MyUserControl()
myControl.Minimize()
由于默认情况下面板以展开状态显示,我所做的就是模拟一个点击事件来实现 `Minimize()` 功能。详情请参见代码。
类关系
以下是一个简单的类图,显示了项目中类的关系。
未来的增强
由于我转换了 jeffb42 的代码,相同或类似的问题和增强也适用于我的代码。目前,我没有计划增强代码——只有在我的特定应用程序(们)中出现 bug 时才修复。如果需要增强应用程序,我会这样做,但目前,代码在我需要的应用程序(们)中运行令人满意。