自定义GroupBox控件与其他控件内部

时间:2011-06-29 21:33:53

标签: 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,我尝试通过在自定义UserControl中放置GroupBox来实现。 (我不想这样。我只是这样做,所以我可以提供一些屏幕截图。)在我这样做之后,我不得不在FlowLayoutPanels上使用EnableDesignMode,以便开发人员可以使用设计器在其中添加控件。问题是它们也变得可移动和可调整大小(我不想这样。它们被正确锚定并且它们不应被移动或调整大小。)当你试图移动它们时你得到“对象引用未设置为实例一个东西。”这让它变得更加丑陋:

Movers and resizers on the FlowLayoutPanels.

问题#3

我希望主FlowLayoutPanel中的元素居中。为此,我必须放置一个控件(描述标签)并将其调整为FlowLayoutPanel的宽度,以便它后面的控件居中。 (如果你问我,凌乱的解决方法。使用TableLayoutPanel执行此操作看起来更容易,但他们的单元格只能容纳一个元素。您可以添加一个Panel以使单元格保留更多元素,但之后您将失去居中。)问题是我必须设置对于我添加的每个控件,锚定为无。我可以挂钩(比如OnDesignerControlAdded ???)自动将添加控件的Anchor设置为None吗?

Control positions with different Anchor values.

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

1 个答案:

答案 0 :(得分:3)

问题#1的快速回答:

在Form或UserControl上设计您的组框(GroupBox1)(无所谓)。

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

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

将其更改为继承自GroupBox:

public partial class CustomGroupBox : GroupBox

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

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

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

E.g。

    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