為ASP.NET控件加入快捷菜單
發(fā)表時間:2024-01-26 來源:明輝站整理相關軟件相關文章人氣:
[摘要]ContextMenu Control 快捷菜單控件概述: MSDN Liabrary 中包含了幾個DHTML快捷菜單的示例。分別提供了對這一功能的不能實現(xiàn)方法。一個快捷菜單就是在頁面中任何位置的一組標記代碼。它包括兩部分內容——界面和腳本(當用戶在頁面右擊時關聯(lián)UI),UI提...
- ContextMenu Control 快捷菜單控件概述:
MSDN Liabrary 中包含了幾個DHTML快捷菜單的示例。分別提供了對這一功能的不能實現(xiàn)方法。一個快捷菜單就是在頁面中任何位置的一組標記代碼。它包括兩部分內容——界面和腳本(當用戶在頁面右擊時關聯(lián)UI),UI提供一個可點擊的元素的列表——菜單項——和各自的內容文本,圖標,命令名(command name),目標url,提示(tooltip),和所有你認為有必要顯示出來的東西?旖莶藛谓缑媸琼撁娴囊徊糠,并且屬于頁面控件樹中的一員。(太多的快捷菜單將會出現(xiàn)執(zhí)行的問題:與大多數(shù)用戶的常規(guī)情況相比,ASP.NET將發(fā)送更多的快捷菜單到瀏覽器)當用戶在頁面的一個元素上右擊時,將引發(fā)一段JavaScript,這段腳本將快捷菜單移動到右擊的位置顯示。
快捷菜單將保持隱藏屬性,只有當用戶在頁面的一個綁定個快捷菜單的元素上右擊時,快捷菜單才顯示。頁面元素接收腳本事件并彈出一個快捷菜單作為響應。腳本事件信賴于瀏覽器,在Internet Explorer 5.0和更新版本中是 OnContexMenu事件.在Netscape6.0和更新版本中你要使用 OnMouseUp 事件(在Internet Explorer 5.0+中你也可能使用OnMouseUp事件,但要多寫幾行代碼)在接收事件的腳本中,獲取快捷菜單的UI代碼塊并且將它移動到發(fā)生點擊的位置。同時設置彈出的panel的 visibilty屬性。當用戶在菜單項上點擊時,頁面回傳并引發(fā)服務器端事件。對于服務器而言,點擊一個菜單項和點擊一具常規(guī)的按鈕沒什么區(qū)別。
當用戶戶想取消已經(jīng)打開的快捷菜單時怎么辦呢?在windows程序中,按下Esc鍵或者在菜單區(qū)域外點擊都可以取消已彈出的快捷菜單。所以你必須在Web中實現(xiàn)這一功能。請注意,只有快捷菜單處于活動(顯示出來)時,Esc鍵才有郊。因為Esc還可用于其它元素的其它鍵盤快捷方式。
我還可以讓菜單在用戶鼠標移開菜單時隱藏?梢酝ㄟ^腳本操作 OnMouseLeave 事件實現(xiàn)。
- 使用彈出菜單控件
假定我們已以設計出了這個彈出菜單(我們一會兒再說如何實現(xiàn)這個快捷菜單控件),那么如何使用它在ASP.NET頁面中添加一個或多個快捷菜單呢?首先,在Visual Studio® .NET的工個欄中拖一個或多個快捷菜單控件到頁面上。然后,為每個菜單添加菜單項,并配置每個菜單項的的工具提示,命令名(command name)和其它所需的內容,例如快捷鍵和幫助主題的鏈接。命令名(command name)用于在響應點擊快捷菜單發(fā)生頁面回傳時確定是哪一個菜單項被點擊;對每一個快捷菜單控件實例的菜單項集合它必須是唯一的。
你必須在HTML標簽的OnContextMenu事件中加入代碼來彈出快捷菜單,代碼必須信賴一系列的參數(shù),象點擊的x,y坐標,點擊的元素,和要使用的快捷菜單的實例等。注意:如果必要你可以使用這種方式完全代替瀏覽器的快捷菜單。綁定到OnContextMenu事件執(zhí)行的JavaScript代碼是在運行時動態(tài)生成的。ContextMenu控件將暴露一個集合屬性來包含分綁定快捷菜單的控件集合,在ContextMenu控件將在運行時給這些要綁定的控件一個 oncontextmenu 屬性。OK!完成!可以測試了。
讓我們先來想一下ContexMenu控件和頁中任意的顯示快捷菜單的元素的綁定機制,這種機制對設計時的支持怎么樣?理想的情況是:根據(jù)基類每一個Web控件直接暴露一個 ContextMenuId屬性。然后在屬性窗口中選擇這個屬性時,將看到在頁面中的ContextMenu控件的列表。當然這些ContextMenu控件我們是已經(jīng)創(chuàng)建了的;ContextMenuId屬性在ASP.NET 1.x中不支持,在將來的ASP.NET2.0中也不支持。
在Visual Studio .NET 2003 集成開發(fā)環(huán)境中,ASP.NET復合控件可以很好的完成這一工作。可以通過使用類撰寫組合現(xiàn)有控件來創(chuàng)作新控件。復合控件可呈現(xiàn)一個重新使用現(xiàn)有控件功能的用戶界面。復合控件可以從子控件的屬性合成屬性并處理由子控件引發(fā)的事件。它還可以公開自定義屬性和事件。
我不選擇使用復合控件有以下幾個原因:一個是Visual Studio .NET 2003對于Web窗體中的控件功能的擴展支持的不好(請參見:Extender provider components in ASP.NET: an IExtenderProvider implementation),第二,在Visual Studio 2005的ASP.NET設計器中不再支持組件托盤區(qū)。Web窗體設計器現(xiàn)在僅支持ASP.NET控件而忽略象復合控件這樣的非可視化的組件。Visual Studio 2005將不再信賴InitializeComponent節(jié),并且不再在代碼文件中自動添任何工具生成(tool-generated)的代碼。ASP.NET控件也不設計成具有快捷菜單,所以要綁定快捷菜單只能通過快捷菜單控件自身的執(zhí)行。這里我使用類似ASP.NET驗證控件和被驗證控件之間關聯(lián)的形式。