2

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

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

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

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

  • 一个按钮返回。

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

这是一个预览:

预览自定义 GroupBox 的外观。

问题 #1

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

错误。

问题 #2

因为我不能让它像我想要的那样继承 GroupBox,所以我尝试通过在自定义 UserControl 中放置一个 GroupBox 来做到这一点。(我不想要这个。我只是这样做是为了提供一些屏幕截图。)在我这样做之后,我必须在 FlowLayoutPanels 上启用设计模式,以便开发人员可以使用设计器在其中添加控件。问题是它们也变得可移动和可调整大小(我不希望这样。它们已正确锚定,不应移动或调整大小。)当您尝试移动它们时,您会得到“对象引用未设置为一个东西。” 这使它更丑陋:

FlowLayoutPanel 上的移动器和大小调整器。

问题 #3

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

使用不同的 Anchor 值控制位置。

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

4

1 回答 1

3

问题#1的快速答案:

在 Form 或 UserControl 上设计您的 groupbox (GroupBox1)(没关系)。

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

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

将其更改为从 GroupBox 继承:

public partial class CustomGroupBox : GroupBox

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

this.从粘贴的代码中删除所有出现的。用 替换所有出现GroupBox1this

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

例如

    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
于 2011-08-22T05:12:33.503 回答