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