【问题标题】:Flex: Changing componentsFlex:改变组件
【发布时间】:2010-08-02 01:31:57
【问题描述】:

您好,我想创建一个弹性网页。基本上,我在顶部有一些菜单项,当我单击菜单栏中的其中一个下拉菜单时,该组件将更改为具有不同内容的页面。

我该怎么做?

谢谢。

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    在我看来,您所追求的确切组件是 TabNavigator (Adobe docs)。

    使用起来相当简单。 TabNavigator组件的每个child代表一个标签页的内容(注意child必须是CanvasVBox等容器),child的label属性用来表示标签上的标签标签本身。

    一个使用标签的非常简单的网站可能看起来像这样:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="absolute" width="100%" height="100%" pageTitle="My Website" />
        <mx:TabNavigator width="100%" height="100%">
            <mx:VBox width="100%" height="100%" label="Standard Page">
                <mx:Label text="Standard Page Title" fontWeight="bold"/>
                <mx:Text  width="100%" height="100%"
                    text="Here is some page content." />
            </mx:VBox>
    
            <mx:VBox width="100%" height="100%" label="Image Gallery">
                <mx:Label text="Image Gallery Title" fontWeight="bold" />
                <mx:TileList width="100%" height="100%">
                    <mx:Image source="my_image1.png" />
                    <mx:Image source="my_image2.png" />
                    <mx:Image source="my_image3.png" />
                    <mx:Image source="my_image4.png" />
                </mx:TileList>
            </mx:VBox>
        </mx:TabNavigator>
    </mx:Application>
    

    您可以根据需要在TabNavigator 中堆叠任意数量的子容器组件,并且它们的内容(默认情况下)只有在您选择相关选项卡时才会加载。

    如果您可以更具体地了解您正在尝试构建的内容,那么可能还有一些其他技巧适合您。希望这能给您一个开始。

    编辑:好的,如果您改用下拉菜单,这是相同的概念,但涉及更多的体力劳动。

    TabNavigator 组件使用ViewStack 组件(Adobe docs),它基本上是一堆内容页面,一次只显示一个(由堆栈的selectedIndex 属性确定),带有@ 987654334@ 组件来控制选定的索引。您想要做的仍然是使用同一个 ViewStack 来保存所有页面,但您希望下拉菜单项选择来为您更改 selectedIndex。

    MenuBar 组件 (Adobe docs) 提供从 XMLListCollection 数据提供程序生成的下拉项。要处理项目选择,请将 itemClick 事件处理程序设置为 MenuBar,并根据选择的菜单项设置 ViewStack 的 selectedIndex 属性。

    这样的事情应该给你一个开始,希望 cmets 帮助解释它。从那里您可以添加页面、MenuBar 项目等。

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
        <mx:Script>
            <![CDATA[
                import mx.events.MenuEvent;
    
                /**
                 * Handle the selection of a menu item.
                 */
                private function menuItemClickHandler(event:MenuEvent):void
                {
                    // Get the submenuitem node that was clicked
                    var selection:XML = XML(event.item);
                    // Depending on the label of the item that was clicked,
                    // modify the selectedIndex property of the content ViewStack
                    switch(selection.@label.toString())
                    {
                    case "Page 1":
                        pageStack.selectedIndex = 0;
                        break;
    
                    case "Page 2":
                        pageStack.selectedIndex = 1;
                        break
                    }
                }
            ]]>
        </mx:Script>
    
        <!-- Data provider collection for the menu bar -->
        <mx:XMLListCollection id="menuXLC">
            <mx:source>
                <mx:XMLList>
                    <menuitem label="Content">
                        <submenuitem label="Page 1" />
                        <submenuitem label="Page 2" />
                    </menuitem>
                </mx:XMLList>
            </mx:source>
        </mx:XMLListCollection>
    
        <!-- MenuBar to provide dropdown items -->
        <mx:MenuBar dataProvider="{menuXLC}" width="100%"
            labelField="@label"
            itemClick="menuItemClickHandler(event)" />
    
        <!-- ViewStack containing the various content pages -->
        <mx:ViewStack id="pageStack" width="100%" height="100%">
            <!-- Each of these child components represents a separate page of content.
                 You should really define them in separate components. -->
            <mx:VBox id="contentPageOne" label="First Page" width="100%" height="100%">
                <mx:Label text="First Page Title" />
                <mx:Text text="First Page content." />
            </mx:VBox>
    
            <mx:VBox id="contentPageTwo" label="Second Page" width="100%" height="100%">
                <mx:Label text="Second Page Title" />
                <mx:Text text="Second Page content." />
            </mx:VBox>
        </mx:ViewStack>
    </mx:Application>
    

    【讨论】:

    • 嘿,这很有趣。但我的标签实际上是菜单项,所以有下拉菜单,我不确定 tabnavigator 是否是我想要使用的 UI。还有其他选择吗?
    • 查看编辑以使其与 MenuBar 一起使用。整个技巧是将您的页面堆叠在 ViewStack 组件中,然后使用您选择的控制 selectedIndex 的方法。 TabNavigator 很不错,因为它会在幕后为您完成这项工作,但它确实非常简单。
    猜你喜欢
    • 1970-01-01
    • 2010-12-13
    • 2011-04-18
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多