【问题标题】:Custom anchoring in Windows FormsWindows 窗体中的自定义锚定
【发布时间】:2011-08-10 18:00:39
【问题描述】:

我有一个自定义表单,它的边缘有 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++;
    }
}
}

目前,基本问题对象由三部分组成。一个用户控件、一个组框和一个标签。所有这些项目都设置为自动调整大小,左侧锚点,右侧除了用户控件,因为我无法在属性窗口中设置它,但我想我是在上面的方法中设置它。

目前的结果是容器面板一开始就画得很完美,但是从来没有调整大小。问题对象的绘制尺寸与其制作时相同,但这不是最大或最小尺寸。


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

【问题讨论】:

  • 欢迎来到 SO!请在下面查看我的回复。出于礼貌,如果您发现此答案(或任何未来的答案)有帮助,请投票赞成。同样,在一段合理的时间后,如果一个答案优于其他答案,请选择答案旁边的“检查”按钮,以奖励回答者的回答。
  • 在获得 15 分之前,我无法对您的回复投赞成票:p
  • BaseQuestionObject.FitAndPlaceObject() 方法对传入的BaseQuestionObject 做了什么?它是否设置了位置和大小?
  • 确实如此,例如它告诉 BaseQuestion 的这个实例应该在哪里绘制它。我想我是通过他们的方式得到的,测试了更多的东西,我会更新我的帖子后记。

标签: c# winforms


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回复;我继承了这段代码,所以我有一个艰难的起点。首先表单不是标准的,所以当我试图将用户控件锚定到左上角时,它隐藏在顶部面板下,所以看起来我在这个项目中必须使用的表单基本上是空白表单。至于我想要达到的目标:想想 gmail。收件箱。我希望我的问题对象堆叠到顶部,并且可以移动。
  • 我会尝试使用 FlowLayoutPanel,而不是 Panel。 FlowLayoutPanel 允许您以垂直方式“堆叠”控件。再次,我建议在 VS 中创建一个测试项目并将这些控件添加到测试表单中。试一试,问你可能有的任何新问题。我理解继承项目的头痛。我以前去过那里几次。 ://
  • 再次感谢 RLH 我将创建一个新项目来测试其他面板。我暂时确实解决了这个问题,尽管我认为面板布局最终可能会是一个更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多