Flex Menu 各种数据源定义方式的区别

使用Menu时,需要定义数据源与组件

其中关于数据源的定义方式有4种选择,而常见的菜单一类的组件有Menu与MenuBar

Menu与MenuBar一个比较明显的区别就是:Menu不能在mxml中定义,而MenuBar可以。另外形象外观现实上也有差异

言归正传,重点是数据源的定义。

1.使用XML方式

在使用XML定义menu数据源时,请务必遵守e4x格式(你最好显示声明 format="e4x"),并且通常都包含跟标签<root></root>,然后使所有菜单(包含子菜单)项的表签一致,至于标签名则随意了。一个可能的定义看起来如下:

 

<mx:XML format="e4x" id="menuXML2">
	<root>
		<menuitem label="menuI">
			<menuitem label="menuI-I" enabled="false"/>
			<menuitem label="menuI-II" enabled="true" type="normal"/>
		</menuitem>
		<menuitem label="menuII" toggled="false"/>
		<menuitem label="menuIII" toggled="true"/>
         </root>
</mx:XML>

事实上,这里的root名可以任意,e4x标准解析xml时是根据层次关系的 而不是标签名。

 

这里,我使用menu,前面说过不能在mxml中定义,于是一个可能的定义方式如下:

 

var menu1:Menu = Menu.createMenu(null,menuXML2,false);
menu1.show(100,200);//别忘了这个方法!

试着运行,你会神奇的发现,出来的菜单中全是代码。

 

这是为什么呢?

查阅API:

 

属性	类型	说明
enabled	Boolean	 指定用户可以选择菜单项 (true),还是不可以选择菜单项 (false)。如果未指定,则 Flex 将假定该值为 true 来处理此项目。如果您使用默认数据说明符,则数据提供程序必须使用 enabledXML 属性或对象字段来指定此特征。
groupName	字符串	 (仅对 radio 类型有意义并且是必需的)用于关联单选组中的单选按钮项目的标识符。如果使用默认数据描述符,则数据提供程序必须使用 groupNameXML 属性或对象字段来指定此特征。
icon	类	 指定图像资源的类标识符。此项目不适用于 check、radio 或 separator 类型。您可以使用 checkIcon 和 radioIcon 样式来指定一些图标,用于所选单选项目和复选框项目。菜单的 iconField 或 iconFunction 属性可以确定数据中用于指定图标的字段名称,或确定用于确定图标的函数。
label	字符串	 指定控件中显示的文本。此项目适用于除 separator 之外的所有菜单项类型。菜单的 labelField 或 labelFunction 属性确定数据中指定标签的字段名称,或确定标签的函数。(如果数据提供程序采用 E4X XML 格式,则必须指定其中一个属性以显示标签。)如果数据提供程序是字符串数组,则 Flex 使用字符串值作为标签。
toggled	Boolean	 指定选择复选项目还是单选项目。如果未指定,则 Flex 处理该项目的方式将视同该值为 false 一样,并且该项目是不选中的。如果使用默认数据描述符,则数据提供程序必须使用切换 XML 属性或对象字段来指定此特征。
type	字符串	 指定菜单项的类型。有意义的值为 separator、check 或 radio。Flex 将其它所有值或无类型条目的节点视为常规菜单条目。如果使用默认数据描述符,则数据提供程序必须使用类型 XML 属性或对象字段来指定此特征。

原来标签名是根据labelField来从xml数据源中获取的。我们未指定,默认便是获取xml代码

 

你只需要加上一行代码就可解决这个问题,完善后的代码看起来像是这样:

 

var menu1:Menu = Menu.createMenu(null,menuXML2,false);
menu1.labelField = "@label";
menu1.show(100,200);

2.使用XMLList

基本用法同xml,但是不同的地方在于,xmlList不需要root标签。因此,类似的代码看起来像是这样:

 

<mx:XMLList id="menuXML">
	<menuitem label="menuI">
		<menuitem label="menuI-I" enabled="false"/>
		<menuitem label="menuI-II" enabled="true" type="normal"/>
	</menuitem>
	<menuitem label="menuII" toggled="false"/>
	<menuitem label="menuIII" toggled="true"/>
</mx:XMLList>

3.使用Array

使用Array是最简单的方法,然而看起来可能并不如xml格式的那么直观,并且书写起来容易出错(你得小心别漏了逗号和花括号以及分号!)

类似的代码声明看起来像是这样“

 

[Bindable]
public var menuArray:Array = [
	{label:"menuI",children:[
		{label:"menuI-I",enabled:false},
		{label:"menuI-II",enabled:true,type:"normal"}
		]
	},
	{label:"menuII",toggled:false},
	{label:"menuIII",toggled:true},
];

然后在as中“绑定”(应该叫调用更合适吧)时的代码和上面基本一致,不过有一点小的不同的地方就是,不需要显示声明menu1.labelField = "@label";flex会自动将label字符串的值作为menu的label

4.使用<mx:Model>

相对来说使用model要受限得多。

从格式上来说model和采用e4x的xml格式相同,一个可能的model声明如下:

 

<mx:Model id="menuXML3">
	<root>
		<menuitem label="menuI">
			<menuitem label="menuI-I" enabled="false"/>
			<menuitem label="menuI-II" enabled="true" type="normal"/>
		</menuitem>
		<menuitem label="menuII" toggled="false"/>
		<menuitem label="menuIII" toggled="true"/>
</mx:Model>

在as的代码调用(即menu的声明语句)也有区别

 

var menu1:Menu = Menu.createMenu(null,menuXML3.menuitem,false);
//menu1.labelField = "@label";//不需要这行语句!
menu1.show(100,200);

运行测试后也会出乎你的意料,只显示第一层次的菜单项而忽略子项!

也许这是Flex menu在处理model时的一个不同,另一方面这也使得model的使用更加灵活(你可以指定特定层次的数据项

转载于:http://www.cnblogs.com/tech-romance/articles/1943410.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值