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 (ほぼ正しい) ですが、2 番目の幅は関係なくcreationPolicy="all"0 width="100%"(ゼロ) です。

ms:ViewStack選択したコンポーネント以外のコンポーネントの幅を設定していないことがわかりました。

この動作の背後にあるロジックは何ですか?
2 番目のグループが実際の幅を持ち、作成完了時にそれを取得できるようにするには、どうすれば修正できますか?

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要素をレンダリングする必要がないためです。フレックスコンテナを設定creationPlicyするallと、内部要素が作成されますが、コンテナが要素のサイズを設定するという意味ではありません。

2番目のグループが実際の幅になり、作成が完了したときに取得できるように修正するにはどうすればよいですか?

イベントを使用しますupdateComplete。FlexupdateCompleteは、コンポーネントのレイアウト、位置、サイズ、またはその他の視覚的特性が変更され、コンポーネントが表示用に更新されるたびにイベントをディスパッチします。TestGroupしたがって、2番目が最初に選択されるときに取得されます。

于 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 に答える