Winforms: 调整窗体控件中用户控件的大小

3

背景:

我正在尝试使用Microsoft Prism指南构建表单。

我有两个用户控件被注入到一个表单中。 该表单包含两个面板,代表将容纳用户控件的容器。

用户控件通过DI在运行时注入(我正在使用类似于MVVM但针对Winforms进行了调整的MVP模式)。

表单具有默认的最小大小,但未指定最大大小。改变表单大小的唯一方法是使其全屏。它的AutoSize属性设置为TRUE,AutoSizeMode设置为GrowAndShrink

两个用户控件的AutoSize属性均设置为TRUE。 用户控件内的所有容器的AutoSize属性均设置为TRUE,DOCK设置为FILL,AutoSizeMode = GrowAndShrink。未设置控件的最大大小。

表单中的面板堆叠在彼此下面,并将Anchor属性设置为:TOP、LEFT、RIGHT,分别为:BOTTOM、LEFT、RIGHT。

问题:

当将表单调整为全屏时,我希望用户控件会扩展以填充整个屏幕。

但事实并非如此。

用户控件的大小不会更改,我无法找出原因。

谢谢。

更新

如果我将表单内面板的DOCK属性更改为TOP、FILL,那么面板将被调整大小,但面板内的用户控件仍然不会更改大小。


1
你提供了一堆相互矛盾的布局指令,Anchor 调整大小,Dock 调整大小,AutoScale 调整大小,实际上应该发生什么?如果这些用户控件需要按比例缩放,则使用一个停靠填充的 TableLayoutPanel。 - Hans Passant
我提到了所有的布局设置,因为这样别人可以指出一些明显的错误。最终目标是能够在运行时动态地将两个自定义控件注入到表单中,并且能够正确调整大小。任何能够实现这个目标并且不需要额外代码的方法都是受欢迎的。 - Radu Cojocari
2个回答

4

不必设置控件的 Dock 和 AutoSizeMode 属性,只需使用 Anchor 属性即可,您会发现它能够正常工作。

我从不使用 AutoSize = true。我总是将其设置为 false (事实上,我不得不检查一些窗体以验证控件上是否存在 AutoSizeAutoSizeMode 属性)。

在您描述的场景中,我会将 Anchor 设置为 Top、Left、Bottom、Right,对于面板和其中包含的控件都是如此。


将两个面板的锚点设置为top、left、bottom、right会导致面板重叠。如果我将第一个面板的锚点设置为TOP、LEFT、RIGHT,将第二个面板的锚点设置为BOTTOM、LEFT、RIGHT,它们不会相应地调整大小。尝试设置控件的所有锚点并没有起作用,然而,正如@Schlinger建议的那样,将DOCK设置为FILL解决了部分问题,即用户控件像应该的那样填充了窗体,但是其中的控件没有调整大小。也许这与我使用FlowLayout作为用户控件的主容器有关? - Radu Cojocari

1

将面板中控件的 Dock 属性也设置为 Fill


它确实调整了添加在表单中的用户控件的大小,但是用户控件的内容没有按比例缩放。我在自定义控件中使用FlowLayout作为所有用户控件的容器。有什么建议吗?谢谢。 - Radu Cojocari
设置用户控件上应调整大小的控件的锚定属性。例如:当文本框在向右扩展窗体时应向右移动,设置锚定为TOP、LEFT和RIGHT。 - Schlinger
尝试为面板设置建议的锚点,但没有成功。可能是因为它位于FlowLayout控件内,并且我使用了流中断属性?我不希望其他用户控件与该面板处于同一行。 - Radu Cojocari
你必须在诸如文本框、按钮、标签等控件上设置锚点。 - Schlinger
这是UI的外观。在左边,您可以看到用户控件由什么组成。所有带有编号的控件都将锚定属性设置为TOP、LEFT、RIGHT。它们都按预期工作,除了控件7。当我将控件7向右拖动(在设计器中),我希望控件3和1也会向右移动,但实际上并没有发生。如果我尝试拉动控件4,控件7会跟随移动。我进行了相同的设置,应该可以工作。唯一不同的是,我使用的是流式布局面板而不是普通面板。 - Radu Cojocari
刚刚测试了一下流式布局中带有锚点的控件的行为。锚点被忽略了,这就是导致我的问题的原因。谢谢! - Radu Cojocari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接