我有一个自定义表单,其边缘有4个面板。我想锚定另一个面板以包含用户控件到窗体的可见边缘。一旦完成,我就想将未确定数量的控件锚定到已经锚定的面板上。我对此很陌生,我不知道这是实现我的目标的最佳方法,即在调整表单大小时调整大小的对象列表。我从这个角度工作的原因是我希望对象是可点击的,可移动的,而不仅仅是文本行。
我的想法是这样的。
----------------------------------------
| Header Panel |
----------------------------------------
|| <--left panel right panel->||
|| [ user control object ]||
|| [ user control object ]||
|| [ user control object ]||
|| [ user control object ]||
----------------------------------------
| Bottom Panel |
----------------------------------------
目前我可以根据需要绘制包含用户控件对象的面板,但它不会调整父节点大小,当我尝试将其锚定到父节点时,它会锚定到错误的位置。我还尝试将用户控件对象锚定到用户控制面板,但它们根本没有调整大小。
所以这是容器面板的代码
//This is called after InitializeComponent(), I would assume the anchor would go
//in here somewhere, but I need the anchor to be offset by the bounds of the
//other panels as listed below.
private static void SetQuestionContainerBounds(SessionReviewForm instance)
{
instance.pnlQuestionContainer.Top = instance.HeaderPanel.Bottom;
instance.pnlQuestionContainer.Left = instance.LeftPanel.Right;
instance.pnlQuestionContainer.Width = instance.RightPanel.Left - instance.pnlQuestionContainer.Left;
instance.pnlQuestionContainer.Height = instance.StatusPanel.Top - instance.pnlQuestionContainer.Top;
}
在我创建表单并定位pnlQuestionContainer后,我开始创建称为基本问题对象的用户控件,锚定它们,并将它们添加到pnlQuestionContainer
private void DisplayData()
{
// tracks the number of questions, used in placement of objects
int questionCount = 0;
// if the session question is marked for review
// generate a new question object and place it.
foreach (SessionQuestion sq in thisSessionPart.SessionQuestions)
{
if(sq.MarkForReview)
{
BaseQuestionObject bqo = new BaseQuestionObject(sq, parentSession);
BaseQuestionObject.FitAndPlaceObject(pnlQuestionContainer, bqo, questionCount);
bqo.Anchor = (AnchorStyles.Left | AnchorStyles.Right);
pnlQuestionContainer.Controls.Add(bqo);
questionCount++;
}
}
}
基本问题对象目前由三部分组成。 userControl,组框和标签。所有这些项目都设置为自动调整左侧,右侧的锚点,但用户控件除外,因为我无法在属性窗口中设置它,但我想我是在上面的方法中设置它。
目前的结果是容器面板首先完美绘制,但它从未调整大小。问题对象的绘制大小与它们的大小相同,但这不是最大值或最小值。
[编辑] 我遇到的问题是锚样式与自动调整不一致。在关闭自动调整大小并操纵anchorStyles之后,我能够获得所需的结果。
答案 0 :(得分:4)
首先,我不是百分之百确定你想要做什么,但锚定比你想要实现它的方式简单得多。
每个控件都有一个名为Anchor
的属性,它是AnchorStyles枚举。这些值可以是Left,Right,Top,Bottom或None,可以进行bitwised ORed,以允许多个锚定值。
默认的“Anchor”值是左上角。如果将锚定更改为Top-Right,则控件将保持相同的大小,但在调整应用程序窗口的右侧时会“浮动”。如果您锚定到左侧,顶部和右侧,则在调整窗口宽度时,控件将会增大和缩小。
我不相信您应该需要任何这些面板,除非它们用于逻辑地将控件组合在一起。您可以通过在表单上放置一组控件并更改其锚点设置来试验锚定。运行您的测试表单并调整其大小,看看会发生什么。
此外,如果您希望在窗口增大和缩小时重新排列表单内容,则标准MS工具箱会有一些您可以使用的控件。具体来说,请查看FlowLayoutPanel和TableLayoutPanel。您可以使用这些控件来微调您希望在表单或表单的某个部分中重新定位子控件的方式。