Flex MenuBar的itemClick問題

引入外部的XML作爲menubar的數據源,但是點擊頂級菜單失效,子菜單正常。
代碼:
外部XML----menu.xml:
<?xml version= "1.0 " encoding= "utf-8 "?>
<root>
<menuitem label= "首頁 " >
<menuitem label= "MenuItem C " />
<menuitem label= "MenuItem D " />
<menuitem label= "MenuItem E "
<menuitem label= "MenuItem E1 "/>
<menuitem label= "MenuItem E2 "/>
</menuitem>
</root>

組件:
<mx:XML id= "menuxml " source= "menu.xml " format= "e4x "/>
<mx:MenuBar width= "100% "
height= "24 " showRoot= "false " dataProvider= "{menuxml} "
= "@label " itemClick= "menuHandler(event) " >
</mx:MenuBar>

點擊事件:
private function menuHandler(event:MenuEvent):void
{
Alert.show( "Label: " + event.item.@label, "Clicked menu item ");
}
——以上是引用提問老兄的代碼

 

解決:

 

itemClick是監控不到menubar的頂級菜單的,itemClick只是和Menu這個類有關,而menubar只是能"CALL"出Menu 的MenuBarItem的集合.但用menubar的change偵聽器能監控到點擊頂級按鈕的事件,不過我在FLEX3正式版測試發現點擊一次 menubar的頂級按鈕會出發兩次change事件,如果用change事件來處理某些問題是很麻煩.

我解決該類問題的方法如下:
比如有個id爲TopMenu的menubar

我用兩個偵聽器來監測menubar的點擊時間,一個是Menu的itemClick事件還有一個是click事件.

就是說用Menu的itemClick的事件還監測子Menu的點擊事件,再用click事件檢測menubar的頂級菜單的點擊事件.

具體:
//itemClick事件
private function menuItemClick(e:MenuEvent):void
{
       trace(e.label)
}
//MouseEvent
private function doClick():void
{
//用MenuBarItem.data是否爲空來判斷該MenuBarItem是否有子Menu,如果有
就不觸發事件,這個可以根據自己的需要來設置
if(TopMenu.selectedIndex!=-1&&MenuBarItem(TopMenu.getChildAt(TopMenu.selectedIndex+1)).data=="")
{
trace(MenuBarItem(TopMenu.getChildAt(TopMenu.selectedIndex+1)).data.@name);
//激活所有MenuBar的頂級MenuBarItem
activeMenu();
//使點過的按鈕不能再點
MenuBarItem(TopMenu.getChildAt(TopMenu.selectedIndex+1)).enabled=false;
}
}
//激活所有MenuBar的頂級MenuBarItem
private function activeMenu():void
{
for each(var item:MenuBarItem in TopMenu.menuBarItems)
{
item.enabled=true;
}
}
MenuBar:
<mx:MenuBar id="TopMenu" itemClick="menuItemClick(event)" click="doClick()" showRoot="false"/>

正如上面,不僅可以解決MenuBar的一些不方便的地方,而且使其具有了一定的記憶功能.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章