65.9K
CodeProject 正在变化。 阅读更多。
Home

可折叠分组框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.42/5 (17投票s)

2004年6月26日

4分钟阅读

viewsIcon

179001

downloadIcon

4339

ExpandingPanel 和 CollapsibleGroupBox 控件简介。

引言

我正在开发一个项目,需要显示可编辑数据(不仅仅是显示数据)的组/容器,于是我想到了这个控件库。我研究过使用 `PropertyGrid` 控件,但它不够优雅,所以我将我的劳动成果呈现给大家。

背景

多年前,我使用 Symantec 的 TCL(Think Class Library,不是 Tcl/Tk)在 Macintosh 上开发了一个项目。TCL 拥有一个视图和面板架构,你可以在一个面板中创建包含控件(或任何东西)的面板,然后将这些面板添加到 `CScroller`。在 CodeProject 上寻找合适的东西时,我偶然发现了 Rollup Control3D Studio Max 风格的 Slidable DialogBar,但它们都是用 C++/MFC 编写的,而我的项目是用 C# 编写的。

使用代码

打开你的 C# Windows Application 解决方案后,打开一个 Form,右键单击工具箱,然后选择“添加/删除项...”菜单项。在“自定义工具箱”对话框出现后,选择“浏览...”按钮,然后导航到 `\CollapsibleGroupBox_1_2\bin\Release` 目录,选择 `UIToolbox.dll`。如果你导航到工具箱中的“我的用户控件”组,你会注意到已经添加了几个项。

返回到解决方案资源管理器,右键单击你的项目,然后选择菜单项“添加\添加新项”。选择一个用户控件并编辑其代码。将基类从 `System.Windows.Forms` 更改为 `UIToolbox.CollapsibleGroupBox`,保存它,然后切换回其设计视图。

此时,你应该会看到类似下图的内容

你可以随意调整它的大小并添加一些控件。

回到你希望添加 `ExpandingPanel` 的窗体(在设计视图中),然后添加一个 `ExpandingPanel`(从工具箱的“我的用户控件”组中),你应该会看到类似这样的内容

切换到窗体的代码,并添加支持代码将 `CollapsibleGroupBox` 添加到 `ExpandingPanel` 中

   public Form1()
    {
        //
        // Required for Windows Form Designer support
        //
        InitializeComponent();

        // UserControl1 is a CollapsibleGroupBox
        expandingPanel1.AddGroup(new UserControl1());
    }

就是这样。你现在可以构建并运行它了。控件会自动处理折叠、展开、自我删除和滚动。

关注点

如果你查看 `CollapsibleGroupBox.cs`,你会注意到,尽管它包含一个用于折叠按钮的控件和一个用于垃圾桶按钮的控件,但它不包含 `GroupBox` 控件。相反,它“模拟”了一个分组框并自己绘制。为什么?第一个草稿使用了 `GroupBox` 控件,一切似乎都正常工作。直到我创建了一个派生自 `ExpandingPanel` 的面板,添加了一些控件,然后构建它。当项目构建时,派生面板似乎“吞噬”了控件。事实证明,这个 bug 与嵌入式分组框和控件的所有权有关,所以现在 `CollapsibleGroupBox` 自己绘制分组框。

已知问题

  • 字体 - 我只使用了控件的默认 8.25pt Microsoft Sans Serif。它 __应该__ 能与任何字体正常工作,但它使用 `Graphics.MeasureString()` 来获取宽度,我注意到 `MeasureString()` 并不总是能正确工作。
  • `ExpandingPanel` 和 `CollapsibleGroupBox` 有时会丢失 - 如果一个窗体包含 `ExpandingPanel` 或 `CollapsibleGroupBox` 控件,我注意到有时下次打开项目时它们会消失。我找到的一个通常有效的解决方法是关闭窗体(包括设计器和代码),然后重新打开它。我还没有弄清楚原因,但这似乎解决了问题。
  • 垃圾桶布局 - 在调整 `CollapsibleGroupBox` 的 `Caption` 和 `ContainsTrashCan` 属性时,我注意到垃圾桶图标并不总是在正确的位置出现。通常构建项目可以解决这个问题。

未来增强功能

以下是我将来可能进行的一些潜在增强

拖放:如果 `ExpandingPanel` 支持拖放,并允许你在 `ExpandingPanel` 中进行拖放以重新排序其项目,或者拖放一个 `CollapsibleGroupBox` 从一个 `ExpandingPanel` 移动到另一个,那就太棒了。用户界面看起来会像这样

添加面板而不是 `CollapsibleGroupBox`:在我的项目中,我只需要分组框,但为了更通用的用途,我可能会将 `ExpandingPanel` 更改为添加一个更通用的类型(面板?)

public class Pane : System.Windows.Forms.UserControl
{
    .
    .
    .
}

public class CollapsibleGroupBox : Pane
{
    .
    .
    .
}


public class ExpandingPanel : System.Windows.Forms.Panel
{
    .
    .
    .

    public void AddGroup(UIToolbox.Pane thePane)
    {
        .
        .
        .
    }
    .
    .
    .
}

常见问题解答

  • 我想修改并使用你的代码。我需要知道任何限制吗?还是可以随意在你的代码基础上进行开发?

    你可以免费使用和修改原始代码以满足你的需求,前提是

    • 在产品的关于框中注明我的功劳(例如,“可折叠分组框,作者:Jeff Beeghly”)。
    • (可选)我收到该产品的完全许可副本(无论产品是免费的、套现的还是商业的)。

    你不能

    • 出售代码(仅代码,而不是作为应用程序的一部分)。
    • 将代码“重新品牌化”为你自己的。
    • 未经书面明确许可,公开发布修改后的代码或公开发布衍生自该代码的作品

历史

  • 2004年6月25日,1.0
    • 首次发布
  • 2006年1月3日,1.2
    • 使用 Visual Studio .NET 2003 构建。
    • 添加了 monkfinger 对调整大小的修复(参见消息板)。
    • 根据 Doug Case 的要求,添加了以编程方式将 `GroupBox` 设置为折叠状态的功能。
    • 从 `CollapsibleGroupBox.cs` 中删除了注释掉的代码。
© . All rights reserved.