菜单设计
菜单主要的作用就是功能模块的导航,通过菜单,用户可以快速的切换到需要的功能。Flex中的菜单大体有三种:上下文菜单、菜单条以及弹出式菜单
一、上下文菜单的设计
上下文菜单是菜单的基础形式,如常用的右键菜单。上下文菜单定义比较灵活,可以在任意位置、任意组件上弹出菜单。
1.1 使用Menu控件创建菜单
在Flex中,上下文菜单的设计需要依靠Menu类来实现。在Menu类的createMenu方法中,已经定义了创建菜单所需要的基本要素,并以参数的形式设置。createMenu方法的语法格式如下所示。 public static function createMenu(parent:DisplayObjectContainer, mdp:Object, showRoot:Boolean = true):Menu 参数说明:
parent:放置菜单控件的父容器。
mdp:菜单控件显示的数据源。
showRoot:在菜单上是否显示数据源的根节点。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Style> .MenuStyle { fontSize : 14; } </mx:Style> <mx:Script> <![CDATA[ // 导入 Menu 类 import mx.controls.Menu; // 创建一个 Menu 控件 private function createAndShow():void { var myMenu:Menu = Menu.createMenu(null, myMenuData, false); myMenu.labelField="@label"; myMenu.styleName = "MenuStyle"; myMenu.show(myButton.x + myButton.width, myButton.y + myButton.height); } ]]> </mx:Script> <!-- 定义菜单数据 --> <mx:XML format="e4x" id="myMenuData"> <root> <menuitem label="菜单 A" > <menuitem label="子菜单 A-1" enabled="false"/> <menuitem label="子菜单 A-2"/> </menuitem> <menuitem label="菜单 B" type="check" toggled="true"/> <menuitem label="菜单 C" type="check" toggled="false"/> <menuitem type="separator"/> <menuitem label="菜单 D" > <menuitem label="子菜单 D-1" type="radio" groupName="one"/> <menuitem label="子菜单 D-2" type="radio" groupName="one" toggled="true"/> <menuitem label="子菜单 D-3" type="radio" groupName="one"/> </menuitem> </root> </mx:XML> <mx:Button id="myButton" label="打开菜单" fontSize="14" click="createAndShow();" x="31" y="27"/> </mx:Application>
1.2 菜单事件
在菜单控件中,定义了几个常用的事件,包括单击菜单项、更改当前选择菜单、菜单显示和隐藏等。这些事件类型包含在MenuEvent类中,
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Style> .MenuStyle { fontSize : 14; } </mx:Style> <mx:Script> <![CDATA[ import mx.events.MenuEvent; // 导入 Menu 类 import mx.controls.Menu; // 创建一个 Menu 控件 private function createAndShow():void { var myMenu:Menu = Menu.createMenu(null, myMenuData, false); myMenu.labelField="@label"; myMenu.styleName = "MenuStyle"; // 添加事件 myMenu.addEventListener(MenuEvent.ITEM_CLICK, itemClickInfo); myMenu.show(myButton.x + myButton.width, myButton.y + myButton.height); } // 菜单事件方法 private function itemClickInfo(event:MenuEvent):void { ta1.text="event.type: " + event.type; ta1.text+="\nevent.index: " + event.index; ta1.text+="\nItem label: " + event.item.@label ta1.text+="\nItem selected: " + event.item.@toggled; ta1.text+= "\nItem type: " + event.item.@type; } ]]> </mx:Script> <!-- 定义菜单数据 --> <mx:XML format="e4x" id="myMenuData"> <root> <menuitem label="菜单 A" > <menuitem label="子菜单 A-1" enabled="false"/> <menuitem label="子菜单 A-2"/> </menuitem> <menuitem label="菜单 B" type="check" toggled="true"/> <menuitem label="菜单 C" type="check" toggled="false"/> <menuitem type="separator"/> <menuitem label="菜单 D" > <menuitem label="子菜单 D-1" type="radio" groupName="one"/> <menuitem label="子菜单 D-2" type="radio" groupName="one" toggled="true"/> <menuitem label="子菜单 D-3" type="radio" groupName="one"/> </menuitem> </root> </mx:XML> <mx:Button id="myButton" label="打开菜单" fontSize="14" click="createAndShow();" x="31" y="27"/> <mx:TextArea x="31" y="82" fontSize="12" width="200" height="100" id="ta1"/> </mx:Application>
二、 菜单条
菜单条是一个显示顶级菜单项的横向条目。单击每个顶级菜单都会弹出一个子菜单。菜单条是继承了Menu类,所以,具有和Menu控件同样的事件。
2.1 使用MenuBar控件创建菜单
菜单条的设计要依赖于MenuBar控件,这个是在Flex中已经提供了。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:MenuBar id="myMenuBar" labelField="@label" fontSize="14"> <mx:XMLList> <menuitem label="菜单 A" > <menuitem label="子菜单 A-1" enabled="false"/> <menuitem label="子菜单 A-2"/> </menuitem> <menuitem label="菜单 B" type="check" toggled="true"/> <menuitem label="菜单 C" type="check" toggled="false"/> <menuitem type="separator"/> <menuitem label="菜单 D" > <menuitem label="子菜单 D-1" type="radio" groupName="one"/> <menuitem label="子菜单 D-2" type="radio" groupName="one" toggled="true"/> <menuitem label="子菜单 D-3" type="radio" groupName="one"/> </menuitem> </mx:XMLList> </mx:MenuBar> </mx:Application>
2.2 菜单事件
由于MenuBar控件是继承自Menu类的,所以具有Menu类的所有事件特性。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Alert; import mx.events.MenuEvent; // MenuBar 控件的 change 事件. private function changeHandler(event:MenuEvent):void { // 获取选中项目的 label 属性 if (event.menu != null) { Alert.show("Label: " + event.item.@label); } } // MenuBar 控件的 itemRollOver 事件. private function rollOverHandler(event:MenuEvent):void { rollOverTextArea.text = "type: " + event.type + "\n"; rollOverTextArea.text += "target menuBarIndex: " + event.index + "\n"; } // MenuBar 控件的 itemClick 事件. private function itemClickHandler(event:MenuEvent):void { itemClickTextArea.text = "type: " + event.type + "\n"; itemClickTextArea.text += "target menuBarIndex: " + event.index + "\n"; } ]]> </mx:Script> <mx:MenuBar id="myMenuBar" labelField="@label" fontSize="14" change="changeHandler(event);" itemClick="itemClickHandler(event);" itemRollOver="rollOverHandler(event);"> <mx:XMLList> <menuitem label="菜单 A" > <menuitem label="子菜单 A-1" enabled="false"/> <menuitem label="子菜单 A-2"/> </menuitem> <menuitem label="菜单 B" type="check" toggled="true"/> <menuitem label="菜单 C" type="check" toggled="false"/> <menuitem type="separator"/> <menuitem label="菜单 D" > <menuitem label="子菜单 D-1" type="radio" groupName="one"/> <menuitem label="子菜单 D-2" type="radio" groupName="one" toggled="true"/> <menuitem label="子菜单 D-3" type="radio" groupName="one"/> </menuitem> </mx:XMLList> </mx:MenuBar> <mx:TextArea id="rollOverTextArea" width="200" height="100" x="10" y="64"/> <mx:TextArea id="itemClickTextArea" width="200" height="100" x="218" y="64"/> </mx:Application>
三、 弹出式按钮菜单的设计
弹出式按钮菜单是一个以按钮的形式弹出的菜单。当用户单击按钮时,会弹出一个顶级的菜单项。与菜单和菜单条不同,弹出式按钮菜单只支持顶级菜单。
3.1 使用PopUpMenuButton控件创建菜单
要设计一个弹出式按钮菜单,需要使用Flex中提供的PopUpMenuButton控件。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ // 菜单数据 [Bindable] public var menuDP:Array = [ {label: "收件箱", data: "inbox"}, {label: "日历", data: "calendar"}, {label: "发件箱", data: "sent"}, {label: "已删除邮件", data: "deleted"}, {label: "垃圾邮件", data: "spam"} ]; ]]> </mx:Script> <mx:PopUpMenuButton id="p1" showRoot="true" dataProvider="{menuDP}" fontSize="14" x="33" y="31"/> </mx:Application>
3.2 菜单事件
PopUpMenuButton是PopUpButton控件的子类,所以,PopUpMenuButton控件支持PopUpButton控件的所有事件。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.events.*; import mx.controls.*; // 初始化数据 private function initData():void { Menu(p1.popUp).selectedIndex = 3; } // itemClick 事件 // 获取 label 和 data 属性的值, // 获取索引 index public function itemClickHandler(event:MenuEvent):void { Alert.show("itemClick event label: " + event.label + " \nindex: " + event.index + " \nitem.label: " + event.item.label + " \nitem.data: " + event.item.data); } // 单击事件 public function clickHandler(event:MouseEvent):void { Alert.show(" Click Event currentTarget.label: " + event.currentTarget.label); } // 菜单数据 [Bindable] public var menuDP:Array = [ {label: "收件箱", data: "inbox"}, {label: "日历", data: "calendar"}, {label: "发件箱", data: "sent"}, {label: "已删除邮件", data: "deleted"}, {label: "垃圾邮件", data: "spam"} ]; ]]> </mx:Script> <mx:PopUpMenuButton id="p1" showRoot="true" dataProvider="{menuDP}" click="clickHandler(event)" itemClick="itemClickHandler(event);" fontSize="14" /> </mx:Application>