我不喜欢任何可用的解决方案,因此我开始制作自己的向导界面。我对向导的每个步骤都使用 GroupBox,但由于每个步骤(每个 GroupBox)都必须具有相同的结构和样式,因此我决定使用自定义控件。
现在我需要一个包含以下元素的自定义 GroupBox:
FlowLayoutPanel,以便开发人员可以使用设计器在其中放置所需的控件。 (例如两个 TextBox 控件,以便用户可以输入用户名和密码。)
FlowLayoutPanel 中用于描述步骤的标签。
返回按钮。
另一个 FlowLayoutPanel,用户可以在其中放置自定义按钮。
这是预览:
问题#1
当我创建一个新的 UserControl 并使其继承 GroupBox 时,我无法获得可以在其中放置和定位内容的 GroupBox。我在设计器中看到的只是这条消息:
问题#2
由于我无法让它像我想要的那样继承 GroupBox,因此我尝试通过将 GroupBox 放入自定义 UserControl 中来实现。 (我不想要这个。我这样做只是为了提供一些屏幕截图。)完成此操作后,我必须在 FlowLayoutPanel 上启用 DesignMode,以便开发人员可以使用设计器在其中添加控件。问题是它们也变得可移动和可调整大小(我不希望这样。它们正确锚定,不应移动或调整大小。),当您尝试移动它们时,您会得到“对象引用未设置为实例”一个东西。”这使它变得更难看:
问题#3
我希望主 FlowLayoutPanel 中的元素居中。为此,我必须放置一个控件(描述标签)并将其大小调整为 FlowLayoutPanel 的宽度,以便其后面的控件居中。 (如果你问我,这是一种困惑的解决方法。使用 TableLayoutPanel 执行此操作看起来更容易,但它们的单元格只能容纳一个元素。您可以添加一个面板以使单元格容纳更多元素,但随后您就会失去居中位置。)问题是我必须设置对于我添加的每个控件,都锚定为“无”。我可以 Hook 某些东西(例如 OnDesignerControlAdded???)来自动将添加的控件的 anchor 设置为 None 吗?
您的所有答案都将帮助我构建开源项目 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/