本地菜單
Native Menu API 提供了建立程式,視窗,操作功能表和彈出式菜單的相關類。
AIR 菜單概要
native menu類運行程式訪問到作業系統的本地菜單特性。NativeMenu對象用於建立應用程式菜單(OSX系統可用),window menus (Windows系統可用), 操作功能表和彈出式菜單。
菜單的類型
AIR支援一下類型的菜單:
應用程式菜單
應用程式菜單必須通過Shell類訪問,在Mac OS X,系統上應用程式菜單由作業系統自動提供。應用程式使用這些AIR菜單API添加功能表項目和子功能表到標準菜單上並註冊處理函數,當然你也可以完全替換掉標準菜單。
表單菜單
通過建立NativeMenu對象,然後賦值給NativeWindow.menu屬性來添加表單菜單。Windows作業系統支援表單菜單,但是Mac OS X不可以。
操作功能表
操作功能表被添加到HTMLControl組件的互動對象和文件項目上。最典型的例子就是在HTML元素上使用Webkit API,當然也可以直接在HTMLControl上使用操作功能表。
系統托盤菜單
通過建立NativeMenu對象並賦值給Shell.shell.icon.menu屬性來建立系統托盤菜單。
Flex 菜單
Flex framework提供了一組Flex菜單類。這些Flex菜單類不需要表單繼承系統表單風格即可使用而且還可在MXML格式中聲明。如果你使用Flex Framework,這時就可以用Flex菜單類來代替本地菜單類了。
自訂菜單
本地菜單是在Flash和HTML渲染模型之外由作業系統負責繪製的,當然我們也可以自己繪製自己的非本地菜單,不過遺憾的是目前AIR菜單類還不支援“自繪製”菜單。
菜單結構
一個菜單包含一個或多個功能表項目。一個功能表項目可以是一個命令,一個子功能表,或一個分隔字元,一般情況下,一個功能表項目就是一個命令,如果功能表項目的submenu屬性被賦值為NativeMenu對象則變為子功能表,如果功能表項目建構函式的isSeparator參數為true,則變為分隔字元。
最頂層的功能表項目顯示在功能表列上,其他子功能表添加在應用程式和表單菜單的頂層菜單中(雖然有些作業系統可以直接把功能表項目放在功能表列上,這樣看起來好像很不符合常規)。
下面的表徵圖示範典型的菜單結構。根菜單包含子功能表“File”和“Edit”。"File"菜單包含兩個命令和一個子功能表(用於顯示最近開啟的文檔,它也是一個子功能表,包含三個功能表項目)。"Edit"菜單包含三個命令和一個分隔字元。
菜單事件
菜單和功能表項目都可以發出displaying 和 select事件:
Displaying:
在菜單即將被顯示之前,菜單及其子功能表會發出displaying事件通知其註冊的監聽器。Displaying事件給你一個機會來更新菜單內容或功能表項目狀態。例如在"Open Recent"功能表項目的displaying處理函數可以改變反應當前閱讀過的文檔功能表項目。
Event對象的target屬性指向被顯示的菜單,currentTarget 則是被註冊監聽器監聽的對象,既可以是菜單本身,也可以是其功能表項目。
Select:
當使用者點擊命令項時,該命令項會發出一個select事件給註冊的監聽器,不過子功能表和分隔字元不能被選擇也不會發出select事件。
功能表項目的Select事件會一直往上傳遞到頂層菜單,所以你可以直接在功能表項目上監聽也可以在菜單結構的上層的監聽。當監聽select事件時,需要通過event的target屬性確定是哪個功能表項目觸發了事件,而currentTarget 屬性可以確定當前的菜單對象。
快速鍵
快速鍵是菜單上作業系統鍵盤的一部分功能。無論是Mac OS X還是Windows 系統都允許使用者用鍵盤開啟或選擇某個功能表命令項.
用字串的索引指定快捷字元,字串的第一個字母索引值為“0”。這樣如果把“Format”字串的“r“字母作為快捷字元,應設定其索引值mnemonicIndex屬性為2。
var item:NativeMenuItem = new NativeMenuItem("Format");
item.mnemonicIndex = 2;
功能表項目狀態
功能表項目有兩個狀態屬性,checked 和enabled:
checked
設定為true會在功能表項目字元前加上標誌
var item:NativeMenuItem = new NativeMenuItem("Format");
item.checked = true;
enabled
設定功能表項目是否可用
var item:NativeMenuItem = new NativeMenuItem("Format");
item.enabled = false;
關聯對象到功能表項目
NativeMenuItem 類的data屬性允許與任意類型的對象相關聯。例如"Open Recent"菜單中,你可以賦值一個File對象到功能表項目上:
var file:File = new File("app-storage:/GreatGatsby.pdf");
var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name));
menuItem.data = file;