1

我有一个简单的应用程序:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*">

    <mx:ViewStack width="100%" creationPolicy="all">
        <s:NavigatorContent width="100%">
            <local:TestGroup width="100%"/>
        </s:NavigatorContent>
        <s:NavigatorContent width="100%">
            <local:TestGroup width="100%"/>
        </s:NavigatorContent>
    </mx:ViewStack>

</s:Application>

TestGroup是一个光秃秃的 Spark 组。它具有 creationComplete 方法,其中跟踪组的宽度:

<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="group1_creationCompleteHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function group1_creationCompleteHandler(event:FlexEvent):void
            {
                trace("internal group width: " + this.width)
            }

        ]]>
    </fx:Script>
</s:Group>

当我运行应用程序时,第一个TestGroup宽度为 1600(大约是正确的),但第二个宽度creationPolicy="all"width="100%"0(零)。

事实证明,ms:ViewStack除了选定的组件之外,它没有设置组件的宽度。

这种行为背后的逻辑是什么?
如何修复它,以便我的第二组具有真正的宽度,并且我可以在创建完成时获得它?

4

3 回答 3

1

ViewStack 是一个多视图容器。即使将 creationComplete 设置为 all (顺便说一下,仅适用于单视图容器),Flex也实例化最初对 ViewStack 可见的控件。为了实现您的目标,请尝试使用 ViewStack 之外的其他容器。

可以在此处找到更多详细信息:http: //livedocs.adobe.com/flex/3/html/help.html?content= layoutperformance_05.html

于 2012-10-18T09:04:38.607 回答
1

这种行为背后的逻辑是什么?

因为不需要渲染TestGroup元素。如果你creationPlicyall一个弹性容器设置会创建内部元素,但这并不意味着容器会为元素设置大小。

如何修复它,以便我的第二组具有真正的宽度,并且我可以在创建完成时获得它?

使用事件updateCompleteupdateComplete每当组件的布局、位置、大小或其他视觉特征发生变化并且组件被更新以供显示时,Flex 就会调度事件。所以当你TestGroup第一次选择第二个时你会得到它。

于 2012-10-18T09:52:22.677 回答
1

您可以收听更改事件,每次所选组更改时都会触发该事件。

只有当前活动组会给你她真正的宽度,所以你可以做一些这样的事情

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function onChange(event:Event):void
            {
                if(myViewStack.selectedChild){
                    myViewStack.selectedChild.initMyGroup();  
                }
            }

        ]]>
    </fx:Script>

    <mx:ViewStack id="myViewStack" width="100%" creationPolicy="all" change="onChange()">
        <s:NavigatorContent width="100%">
            <local:TestGroup width="100%"/>
        </s:NavigatorContent>
        <s:NavigatorContent width="100%">
            <local:TestGroup width="100%"/>
        </s:NavigatorContent>
    </mx:ViewStack>

</s:Application>




<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            public function initMyGroup():void
            {
                trace("internal group width: " + this.width)
            }

        ]]>
    </fx:Script>
</s:Group>
于 2012-10-24T09:27:52.090 回答