Windows窗体中的自定义锚定

本文关键字:自定义 窗体 Windows | 更新日期: 2023-09-27 18:05:24

我有一个自定义的窗体,在它的边缘上有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,一个组框和一个标签。所有这些项目都设置为自动大小与左锚,右与用户控件的例外,因为我不能在属性窗口中设置,但我认为我在上面的方法中设置它。

当前的结果是容器面板一开始是完美绘制的,但它永远不会调整大小。问题对象的绘制尺寸与它们的制作尺寸相同,但这不是最大或最小尺寸。


[编辑]我遇到的问题是锚样式不能很好地使用自动缩放。在关闭自动大小并操纵锚样式之后,我能够得到想要的结果。

Windows窗体中的自定义锚定

首先,我不是100%确定你想做什么,但是锚定比你想实现它的方式要简单得多。

每个控件都有一个名为Anchor的属性,它是一个AnchorStyles枚举。这些值可以是Left, Right, Top, Bottom或None,并且可以按位排列或组合在一起以允许多个锚定值。

默认的'Anchor'值是Top-Left。如果您将锚定更改为右上角,则控件将保持相同的大小,但在调整大小时将与应用程序窗口的右侧"浮动"。如果锚定在左侧、顶部和右侧,则控件将随着窗口宽度的调整而增大和缩小。

我不认为你应该需要任何这些面板,除非他们被用来逻辑分组控件在一起。您可以通过在表单上放置一堆控件并更改它们的锚设置来试验锚定。运行你的测试表单并调整它的大小,看看会发生什么。

另外,如果您想在窗口增大和缩小时重新安排窗体的内容,标准的MS工具箱有一些您可以使用的控件。具体来说,看看FlowLayoutPanel和TableLayoutPanel。您可以使用这些控件来微调您希望如何在窗体上或窗体的某个部分中重新定位子控件。