7

近一年来我一直在使用 Flex 遇到这个问题,每次我都想出一个暂时有效的快速破解解决方案。我想看看是否有人有更好的主意。

以下是问题的条件:

|------Container  ------------|
|  explicitHeight:  400 (or whatever)
|                             |
|  |-------- VBox  -------|   |
|  |  percentHeight: 100  |   | 
|  |                      |   |
|  |  |-Repeater------|   |   |
|  |  | Potentially   |   |   |
|  |  | a lot of stuff.   |   |
|--|--|---------------|---|---|

问题是,与我希望发生的相反,VBox 将始终扩展以容纳其中的内容,而不是坚持其父级的显式高度并创建滚动条。

我的解决方案是在对父项的引用中进行硬编码(或者无论我们需要在显示列表的多远位置找到一个明确设置的值而不是百分比)。

我什至考虑在实用程序类中使用它:

public static function getFirstExplicitHeightInDisplayList(comp:UIComponent):Number{
    if (!isNaN(comp.explicitHeight)) return comp.explicitHeight;
    if (comp.parent is UIComponent) return    
         getFirstExplicitHeightInDisplayList(UIComponent(comp.parent));
    else return 0;
}

请告诉我有更好的方法。

4

5 回答 5

13

设置 minHeight = 0 就是您需要做的所有事情。

这告诉 VBox 在调整自身大小时忽略它的孩子的测量值,并根据它自己/它的父母约束来计算它的高度。像往常一样设置其他所有内容,滚动和其他所有内容都将完美运行。

一年前花了几天时间在这上面——这并不直观,他们本可以更好地命名该属性。希望这可以节省你们一些时间...

于 2008-12-17T16:32:47.607 回答
8

您必须在 VBox 上使用“autoLayout”参数,因为文档说:

“默认情况下,VBox 容器的大小足以将图像保持在原始大小。如果禁用布局更新,并使用缩放效果放大图像,或使用移动效果重新定位图像,图像可能会超出 VBox 容器的边界。

您将 autoLayout 属性设置为 false,因此 VBox 容器不会随着图像大小而调整大小。如果图像变大调整到超出 VBox 容器边界的大小时,容器会添加滚动条并在其边界处剪切图像。

我希望这会对你有所帮助。

于 2008-10-29T10:40:02.963 回答
2

AutoLayout=false 似乎只防止在孩子的大小改变时重新运行布局。但是,如果您添加或删除子项,布局仍将重新运行。

设置 minHeight=0 确实将 VBox 的(外部)大小与子项的大小和数量完全断开,这正是我想要的。

翻阅 Flex 源代码,我没有看到设置 minHeight=0 使其按我想要的方式工作的机制,所以我向 Yarin 的发现致敬。谢谢!

于 2009-01-06T17:54:00.740 回答
1

设置容器的属性:

clipContent = true;
verticalScrollPolicy = "off"

然后你的 VBox 应该在它有时自动剪辑percentHeight = 100

在 Flex 3 中为我工作。

如果您需要真正花哨,可以在对象上设置 scrollRect :

scrollRect = new Rectangle(x, y, w, h);

取决于你需要它做什么。

于 2008-11-06T01:13:11.993 回答
0

事实上,Yarin Kessler 在这里为我们带来了唯一正确的答案(不幸的是,我无权评论它的帖子,这就是我在这里这样做的原因)。

当您的 HBox 大小基于百分比值时,您希望只有它的容器会影响它的大小。那是错误的,还有一条规则,一条更强大的规则。事实上,容器(HBox 是)具有最小尺寸,这是它自己的子组件的默认/显式尺寸的添加。

因此,如果您的百分比值导致的值小于最小尺寸,则最小尺寸获胜并应用于 HBox。由于 HBox 正在显示其所有子项,因此不需要滚动条。

所以使用:

minHeight = 0;
minWidth = 0;

就像告诉 HBox 它的最小尺寸是 0 而不是它的子默认尺寸。您正在重新定义它,这样最小尺寸小于百分比值并输掉战斗。

我在 Adob​​e 文档中找到的唯一一个解释这一点的短语是:

基于百分比的容器大小是建议性的。Flex 使容器足够大以适应其最小尺寸的子级。

希望我说清楚了,

(随时纠正我不正确的英文句子......)

于 2013-02-12T13:47:03.947 回答