Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体中的自定义锚定_C#_Winforms - Fatal编程技术网

C# Windows窗体中的自定义锚定

C# Windows窗体中的自定义锚定,c#,winforms,C#,Winforms,我有一个自定义表单,它的边缘有4个面板。我想锚定另一个面板,将用户控件包含到窗体的可见边缘。完成后,我希望将数量不确定的控件锚定到已锚定的面板。我对这一点相当陌生,我不知道这是实现我的目标的最佳方式,即拥有一个对象列表,这些对象随着窗体大小的调整而调整大小。我从这个角度研究它的原因是我希望对象是可点击的,可移动的,而不仅仅是文本行 我的想法是这样的 ---------------------------------------- | Header Panel

我有一个自定义表单,它的边缘有4个面板。我想锚定另一个面板,将用户控件包含到窗体的可见边缘。完成后,我希望将数量不确定的控件锚定到已锚定的面板。我对这一点相当陌生,我不知道这是实现我的目标的最佳方式,即拥有一个对象列表,这些对象随着窗体大小的调整而调整大小。我从这个角度研究它的原因是我希望对象是可点击的,可移动的,而不仅仅是文本行

我的想法是这样的

----------------------------------------
| Header Panel                         |
----------------------------------------
|| <--left panel         right panel->||
|| [ user control object             ]||
|| [ user control object             ]||
|| [ user control object             ]||
|| [ user control object             ]||
----------------------------------------
| Bottom Panel                         |
----------------------------------------
在创建表单并定位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++;
    }
}
}
基本问题对象目前由三部分组成。用户控件、组框和标签。所有这些项目都设置为自动调整大小,锚点为左,锚点为右,但用户控件除外,因为我无法在“属性”窗口中设置,但我想我是在上面的方法中设置的

目前的结果是,容器面板最初绘制得非常完美,但它从未调整大小。问题对象的绘制尺寸与它们的制作尺寸相同,尽管这不是最大或最小尺寸


[编辑]
我遇到的问题是,锚定样式与autosize的关系不太好。关闭“自动调整大小”并操作锚点样式后,我能够获得所需的结果。

首先,我不能100%确定您正在尝试做什么,但锚点比您尝试实现它的方式简单得多

每个控件都有一个名为
Anchor
的属性,它是一个枚举。这些值可以是Left、Right、Top、Bottom或None,并且可以进行位或运算,以允许多个锚定值

默认的“锚定”值为左上角。如果将锚定更改为右上角,则控件的大小将保持不变,但在调整应用程序窗口的大小时,控件将与应用程序窗口的右侧一起“浮动”。如果锚定到左侧、顶部和右侧,控件将随着窗口宽度的调整而增减

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


此外,如果希望随着窗口的增大和缩小而重新排列表单的内容,则标准MS工具箱中有一些控件可供使用。具体来说,请查看和。您可以使用这些控件微调如何在窗体上或窗体的某个部分中重新定位子控件。

欢迎使用SO!请看下面我的回答。出于礼貌,如果你觉得这个答案(或任何未来的答案)有帮助,请投票支持这个答案。同样,在一段合理的时间后,如果一个答案比其他答案好,请选择答案旁边的复选按钮,以奖励回答者的回答。在我得到15分之前,我无法投票支持你的回答:p基本问题对象是什么。FitAndPlaceObject()方法如何处理传递给它的
BaseQuestionObject
?它是否设置了位置和大小?例如,它告诉BaseQuestion的这个实例应该在哪里绘制它。我想我是通过他们的方式得到的,测试了更多的东西,我会在后记中更新我的帖子。谢谢你的回复;我继承了这段代码,所以我有一个艰难的起点。首先,表单不是标准的,所以当我尝试将用户控件锚定到左上角时,它隐藏在顶部面板下,因此我在这个项目中必须使用的表单基本上是空白表单。至于我想要达到的目标:想想gmail。收件箱我希望我的问题对象堆叠到顶部,并且可以移动。我会尝试使用FlowLayoutPanel,而不是面板。FlowLayoutPanel允许您以垂直方式“堆叠”控件。我再次建议在VS中创建一个测试项目,并将这些控件添加到测试表单中。玩一玩,问一些你可能有的新问题。我理解继承项目带来的麻烦。我以前去过那里几次/再次感谢你,我将做一个新的项目来测试其他面板。我确实暂时解决了这个问题,尽管我认为面板布局最终可能是一个更好的解决方案。
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++;
    }
}
}