2012-09-30 143 views
2

我有一個Flex應用程序,需要以編程方式生成菜單,這將是相當複雜和動態的。這樣做的最佳技術是什麼?在Adobe Flex中動態創建菜單?

更新:我已經使用RIAstar建議的菜單項和子項屬性的對象測試了下面的代碼。這是工作,除了我沒有看到「輸入」菜單,它似乎被繞過。我看到的是:

Screenshot

我所期待的 「添加 - >輸入 - >設備{} 0..8」。

感謝任何想法,弗雷德。

<?xml version="1.0" encoding="utf-8"?> 

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.controls.Menu; 
     protected function button1_clickHandler(event:MouseEvent):void 
     { 
      var toplevelMenu:Object = new Object(); 
      toplevelMenu.label = "Top Level"; 
      var addMenu:Object = new Object(); 
      addMenu.label = "Add"; 
      toplevelMenu.children = addMenu; 

      var inputMenu:Object = new Object(); 
      inputMenu.label = "Input"; 

      var inputDevicesMenu:ArrayCollection = new ArrayCollection(); 
      for (var i:int = 0;i < 10;i++) { 
       if ((i % 2) == 0) { 
        var inputDeviceMenu:Object = new Object(); 
        inputDeviceMenu.label = "Device " + i; 
        inputDevicesMenu.addItem(inputDeviceMenu); 
       } 
      } 
      if (inputDevicesMenu.length > 0) { 
       inputMenu.children = inputDevicesMenu; 
      } 
      addMenu.children = [inputMenu]; 

      var menu:Menu = Menu.createMenu(this, toplevelMenu, false); 
      menu.show(event.stageX, event.stageY); 
     } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<s:Button x="56" y="28" label="Show Menu" click="button1_clickHandler(event)"/> 

+2

[菜單](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/controls/Menu.html )類開箱即用(儘管沒有Spark等價物)。 – RIAstar

+0

感謝您的評論。我的問題是,如果我有例如5層深的菜單,如果我使用上述技術,我將不得不保留5個對象引用並鏈接一堆.appendChild調用。只是想知道是否有更好的方法來做到這一點。 –

+0

我想我明白你現在得到的是什麼。您必須創建分層結構_some_的方式。請注意,它並不是XML:它可能是一個具有「children」屬性的數組或IList(我認爲)。也許你會更喜歡那個。 – RIAstar

回答

2

按RIAstar建議和你的代碼,我做了一些修改,在button1_clickHandler功能: -

在功能button1_clickHandler

更新代碼: -

protected function button1_clickHandler(event:MouseEvent):void 
      { 
       var addMenu:Object = new Object(); 
       addMenu.label = "Add"; 

       var inputMenu:Object = new Object(); 
       inputMenu.label = "Input"; 

       var outputMenu:Object = new Object(); 
       outputMenu.label = "Output"; 

       var inputOutputDevicesMenu:ArrayCollection = new ArrayCollection(); 
       inputOutputDevicesMenu.addItem(outputMenu); 
       inputOutputDevicesMenu.addItem(inputMenu); 

       addMenu.children = inputOutputDevicesMenu; 

       var inputDevicesMenu:ArrayCollection = new ArrayCollection(); 
       for (var i:int = 0;i < 10;i++) { 
        if ((i % 2) == 0) { 
         var inputDeviceMenu:Object = new Object(); 
         inputDeviceMenu.label = "Device " + i; 
         inputDevicesMenu.addItem(inputDeviceMenu); 
        } 
       } 
       if (inputDevicesMenu.length > 0) { 
        inputMenu.children = inputDevicesMenu; 
       } 

       var menu:Menu = Menu.createMenu(this, addMenu, true); 
       menu.show(event.stageX, event.stageY); 
      } 

希望這可能有助於得到一些想法......

+0

也感謝RIA明星。 –