如何强制从子级调整父级

时间:2009-07-22 12:10:33

标签: flex actionscript canvas resize

我有一个类似页面的flex应用程序。在我的主应用程序中是一个显示所有页面的持有者(画布)。问题是,当主应用程序启动时,装载在支架内的组件比支架大。支架高度设置为100%但是当我在他内部加载一个更大的组件然后他自己时,他仍然得到滚动条。

我该如何解决这个问题?如果它不可解决,如果我使用viewstack它会正常工作吗?

- 更新---

持有人看起来像这样:

<mx:canvas height="100%">
</canvas>

但是应用程序的结尾是500像素,所以画布高度是500像素高。现在我把一个新的孩子放在1000像素高的支架内。现在持有人高度应该是1000像素高

2 个答案:

答案 0 :(得分:3)

在将组件添加到主画布之前,请检查子组件的大小,以查看它是否大于父组件。如果是,则可以在对象上使用scaleX和scaleY将其缩小以适合您定义的区域。

您在问题中声明的是任何弹性容器的默认行为...将更大的内容放入其中并且您将获得滚动条。要消除滚动条,请使用:

horizontalScrollPolicy="off"
verticalScrollPolicy="off

编辑:

在tabNavigator或viewStack上使用“resizeToContent”...或者您可以将父容器的宽度绑定到当前子容器的宽度。

答案 1 :(得分:1)

这是我用于自动调整大小画布的一些代码

//另存为AutoResizeCanvas.as

package
{
    import mx.containers.Canvas;
    import mx.core.Container;
    import mx.core.UIComponent;

    public class AutoResizeCanvas extends Canvas
    {
        public function AutoResizeCanvas()
        {
            super();
        }

        override protected function measure():void
        {
            super.measure();
            var nh:int = 0;
            var nw:int = 0;
            for( var n:int = 0; n< this.numChildren; n++)
            {
                var c:UIComponent = this.getChildAt( n) as UIComponent;
                if( c is Container)
                {
                    var cc:Container= c as Container;
                    nh += /*cc.viewMetricsAndPadding.top + */cc.viewMetricsAndPadding.bottom + c.height;
                    nw = Math.max( nw, cc.viewMetricsAndPadding.left + cc.viewMetricsAndPadding.right + c.width);
                } 
                else
                {
                    nh += c.height;
                    nw = Math.max( c.width, nw);
                }
            }
            this.measuredWidth = nw;
            this.measuredHeight = nh;
        }
    }
}

//测试代码,粘贴到项目的主要mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*">
    <mx:Script>
        <![CDATA[
            import mx.containers.Panel;
            import mx.containers.HBox;
            private function addOne():void
            {
                var hb:Panel = new Panel();
                hb.height = 100;
                hb.width = 100;
                hb.y = rc.numChildren * 110;
                rc.addChild( hb);
            }
        ]]>
    </mx:Script>
    <local:AutoResizeCanvas id="rc" verticalScrollPolicy="off" borderStyle="solid"/>
    <mx:Button x="497" y="10" label="Add HBox" click="addOne()"/>
</mx:Application>