c# - 自定义 GroupBox 控件,其中包含其他控件

标签 c# winforms visual-studio-2010 custom-controls groupbox

我不喜欢任何可用的解决方案,因此我开始制作自己的向导界面。我对向导的每个步骤都使用 GroupBox,但由于每个步骤(每个 GroupBox)都必须具有相同的结构和样式,因此我决定使用自定义控件。

现在我需要一个包含以下元素的自定义 GroupBox:

  • FlowLayoutPanel,以便开发人员可以使用设计器在其中放置所需的控件。 (例如两个 TextBox 控件,以便用户可以输入用户名和密码。)

  • FlowLayoutPanel 中用于描述步骤的标签。

  • 返回按钮。

  • 另一个 FlowLayoutPanel,用户可以在其中放置自定义按钮。

这是预览:

Preview of what the custom GroupBox should look like.

问题#1

当我创建一个新的 UserControl 并使其继承 GroupBox 时,我无法获得可以在其中放置和定位内容的 GroupBox。我在设计器中看到的只是这条消息:

The error.

问题#2

由于我无法让它像我想要的那样继承 GroupBox,因此我尝试通过将 GroupBox 放入自定义 UserControl 中来实现。 (我不想要这个。我这样做只是为了提供一些屏幕截图。)完成此操作后,我必须在 FlowLayoutPanel 上启用 DesignMode,以便开发人员可以使用设计器在其中添加控件。问题是它们也变得可移动和可调整大小(我不希望这样。它们正确锚定,不应移动或调整大小。),当您尝试移动它们时,您会得到“对象引用未设置为实例”一个东西。”这使它变得更难看:

Movers and resizers on the FlowLayoutPanels.

问题#3

我希望主 FlowLayoutPanel 中的元素居中。为此,我必须放置一个控件(描述标签)并将其大小调整为 FlowLayoutPanel 的宽度,以便其后面的控件居中。 (如果你问我,这是一种困惑的解决方法。使用 TableLayoutPanel 执行此操作看起来更容易,但它们的单元格只能容纳一个元素。您可以添加一个面板以使单元格容纳更多元素,但随后您就会失去居中位置。)问题是我必须设置对于我添加的每个控件,都锚定为“无”。我可以 Hook 某些东西(例如 OnDesignerControlAdded???)来自动将添加的控件的 anchor 设置为 None 吗?

Control positions with different Anchor values.

您的所有答案都将帮助我构建开源项目 Magician on GitHub以及许多其他由它支持的开源项目。预先感谢您所做的一切努力。

最佳答案

问题#1 的快速解答:

在 Form 或 UserControl 上设计组框 (GroupBox1)(这并不重要)。

转到designer.cs文件中的InitializeComponent()并复制与组框及其子控件相关的所有代码。

向项目中添加一个名为 CustomGroupBox 的新自定义控件。

将其更改为从 GroupBox 继承:

public partial class CustomGroupBox : GroupBox

将所有复制的代码粘贴到 CustomGroupBox 的构造函数中(或者粘贴到一个新方法中,如果您想保持整洁,可以在 InitializeComponent() 之后从构造函数中调用该方法)。

从粘贴的代码中删除所有出现的 this.。将所有出现的 GroupBox1 替换为 this

对于您希望开发人员有权访问的任何子控件,请为该控件添加公共(public)属性。

例如

    public FlowLayoutPanel FLP
    { 
        get { return flowLayoutPanel1; } 
    }

当然还要添加您的 CustomDesigner

    public class CustomGroupBoxDesigner : ControlDesigner
    {
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            var c = component as CustomGroupBox;
            EnableDesignMode(c.FLP, "FLP");
        }
    }

并应用属性

[Designer(typeof(CustomGroupBoxDesigner))]
public partial class CustomGroupBox : GroupBox

关于c# - 自定义 GroupBox 控件,其中包含其他控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527531/

相关文章:

c# - 使用数组在 Linq 中过滤 IEnumerable

c# - 如何使用c#绘制图表?

c++ - 智能感知是否可以从嵌套文件夹中使用 "stdafx.h"?

c# - 无法从 singelton 事件取消订阅 signalR 集线器功能

c# - 应用程序运行时动画 gif 不起作用

c# - 如何通过 HTTP 请求发送和发送电子邮件

c++ - 我可以在表单应用程序的 while 循环中查询用户交互事件吗?

wpf - 我可以在 VS2008 中开发也可以在 Mac 上运行的桌面应用程序吗?什么方法?

c++ - 用于 C++ 的 Visual Studio 2010 注释插件

asp.net-mvc-3 - DotNetOpenAuth.Asp 无法在 MVC4 应用程序单元测试中加载程序集或其依赖项之一