我不喜欢任何可用的解决方案,所以我开始创建自己的向导界面。我在向导的每一步使用GroupBox,但由于每一步(每个GroupBox)必须具有相同的结构和样式,我决定使用自定义控件。
现在我需要一个具有以下元素的自定义GroupBox:
FlowLayoutPanel,以便开发人员可以使用设计器将所需的控件放入其中。 (例如,两个TextBox控件,以便用户可以输入用户名和密码。)
FlowLayoutPanel中用于描述步骤的标签。
要返回的按钮。
另一个用户可以自定义按钮的FlowLayoutPanel。
这是预览:
当我创建一个新的UserControl并让它继承GroupBox时,我无法获得一个可以放置的GroupBox并将其放入其中。我在设计师中看到的只有以下信息:
由于我不能像我想要的那样继承GroupBox,我尝试通过在自定义UserControl中放置GroupBox来实现。 (我不想这样。我只是这样做,所以我可以提供一些屏幕截图。)在我这样做之后,我不得不在FlowLayoutPanels上使用EnableDesignMode,以便开发人员可以使用设计器在其中添加控件。问题是它们也变得可移动和可调整大小(我不想这样。它们被正确锚定并且它们不应被移动或调整大小。)当你试图移动它们时你得到“对象引用未设置为实例一个东西。”这让它变得更加丑陋:
我希望主FlowLayoutPanel中的元素居中。为此,我必须放置一个控件(描述标签)并将其调整为FlowLayoutPanel的宽度,以便它后面的控件居中。 (如果你问我,凌乱的解决方法。使用TableLayoutPanel执行此操作看起来更容易,但他们的单元格只能容纳一个元素。您可以添加一个Panel以使单元格保留更多元素,但之后您将失去居中。)问题是我必须设置对于我添加的每个控件,锚定为无。我可以挂钩(比如OnDesignerControlAdded ???)自动将添加控件的Anchor设置为None吗?
您的所有答案都将帮助我构建开源项目Magician on GitHub以及由其支持的许多其他开源项目。提前感谢您的所有努力。
答案 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