Control.GetPreferredSize方法的目的是什么?

4
我正在实现一个用户控件,根据一些属性来改变其大小。据我了解,winforms布局引擎在执行布局时会询问每个子控件的首选大小,并告知它们可以承受的最大大小。
以下是msdn中GetPreferredSize的描述:
Control.GetPreferredSize(Size proposedSize)

Retrieves the size of a rectangular area into which a control can be fitted.

我对以下内容感到困惑:

您可以返回比 proposedSize 参数中指示的约束更大的尺寸,但是当约束减小时,proposedSize 应该减小。

这是什么意思?如果我返回的尺寸大于 proposed 会发生什么?

有人能向我解释一下这是如何工作的吗?

2个回答

2
那条代码的意思是,您可以自由返回比“proposedSize”参数更大的首选大小,但“proposedSize”仍然应影响您的首选大小。例如,对于“GetPreferredSize(new Size(100, 0))”,您返回的大小应小于“GetPreferredSize(new Size(200, 0))”。
请注意,如果您返回较大的大小,也不会发生任何问题;布局引擎将为您排序一切,可能通过减少另一个控件可用的大小来实现。最终,您的首选大小只是引擎的提示,以便它知道正在安排的各种UI组件的相对空间需求。

1

Control.GetPreferredSize 是容器在布局周期中调用的一部分。

它允许被调用的控件返回他们希望拥有的尺寸(如果可能的话)。但是,容器不必遵守这个请求的大小。例如,当一个控件具有顶部停靠设置时,宽度将被定义为包含控件的宽度,而不管从 GetPreferredSize 方法返回的值如何。这种方法对于像流式布局控件这样的容器特别有用,它将一个子控件放置在另一个子控件之后。


标签怎么样?当它们的Dock属性设置为DockStyle.Top时,它们不会改变宽度。 - username
我认为一般来说,它们被定义为AutoSize=False,因此它们会忽略您给定的大小并根据自己的需要调整大小。 - Phil Wright
所以只有在AutoSize = true的情况下,容器才会尊重子控件的大小,对吗? - username
不,容器告诉控件它应该有多大,但标签只是忽略它并保持自己喜欢的大小。 - Phil Wright

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