Search code examples
actionscript-3apache-flexmenu

Flex: how to make a native menu in a AS3 class which extends the WindowedApplication class


We all know how to define a native menu using XML in MXML. It looks like this:

<s:WindowedApplication 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:Declarations>
    <!-- The xml data provider for menu -->
    <fx:XML format="e4x" id="menuData">
        <root>
            <menuitem label="File">
                <menuitem label="Open"/>
                <menuitem label="Save"/>
            </menuitem>
            <menuitem label="Help"/>
        </root>
    </fx:XML>
</fx:Declarations>
<s:menu>
    <mx:FlexNativeMenu dataProvider="{menuData}" labelField="@label" showRoot="false"/>
</s:menu>   

But I need to make a native menu(application menu) using a loaded XML in a class which extends the WindowedApplication class and is extended by the main MXML. How can I do this? Thanks for any help in advance!


Solution

  • Below is the example of actionscript class for menu.

    package com {
    import mx.controls.FlexNativeMenu;
    import mx.controls.Menu;
    
    import spark.components.WindowedApplication;
    
    public class MyNativeMenu extends WindowedApplication{
    
        public var menuData:XML;
        public var flexNativeMenu:FlexNativeMenu;
        public var myMenu:Menu;
        public function MyNativeMenu() {
            menuData = <root>
                <menuitem label="File">
                    <menuitem label="Open"/>
                    <menuitem label="Save"/>
                </menuitem>
                <menuitem label="Help"/>
            </root>;
            flexNativeMenu = new FlexNativeMenu();
            flexNativeMenu.dataProvider = menuData;
            flexNativeMenu.labelField = "@label";
            flexNativeMenu.showRoot = false;
        }
    
        override protected function createChildren():void {
            this.menu = flexNativeMenu;
        }
    }
    }
    

    And the main mxml is like below

    <?xml version="1.0"?>
    <com:MyNativeMenu xmlns:fx="http://ns.adobe.com/mxml/2009"     xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:com="com.*">
    <fx:Script><![CDATA[
        ]]></fx:Script>
    </com:MyNativeMenu>