熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

為ASP.NET控件加入快捷菜單

2013-11-13 11:08:55  來源: .NET編程 

  雖然快捷菜單在桌面應用程序中已經是非常通用的元素但是由於在象ASPNET這樣的基於服務器的技術沒有很好的描繪所以在Web應用程序中快捷菜單並不是很通用要想使用快捷菜單浏覽器必須高度支持DHTML和豐富事件模式例如Microsoft Internet Explorer 及更高版本或者Netscape 然而各種浏覽器的對象模式雖然功能上大至相同但是成員各名字卻各不相同這就需要我們自己實現對象和事件的從一種模式到到另一種模式的轉換

 

  這裡我們創建一個針到Internet Explorer的對象模式的ASPNET快捷菜單接著我將經過修改使其功能支持其它浏覽器

  ContextMenu Control 快捷菜單控件概述

  MSDN Liabrary中包含了幾個DHTML快捷菜單的示例分別提供了對這一功能的不能實現方法一個快捷菜單就是在頁面中任何位置的一組標記代碼它包括兩部分內容——界面和腳本(當用戶在頁面右擊時關聯UI)UI提供一個可點擊的元素的列表——菜單項——和各自的內容文本圖標命令名(command name)目標url提示(tooltip)和所有你認為有必要顯示出來的東西快捷菜單界面是頁面的一部分並且屬於頁面控件樹中的一員(太多的快捷菜單將會出現執行的問題與大多數用戶的常規情況相比ASPNET將發送更多的快捷菜單到浏覽器)當用戶在頁面的一個元素上右擊時將引發一段JavaScript這段腳本將快捷菜單移動到右擊的位置顯示

  快捷菜單將保持隱藏屬性只有當用戶在頁面的一個綁定個快捷菜單的元素上右擊時快捷菜單才顯示頁面元素接收腳本事件並彈出一個快捷菜單作為響應腳本事件信賴於浏覽器在Internet Explorer 和更新版本中是 OnContexMenu事件在Netscape和更新版本中你要使用 OnMouseUp 事件(在Internet Explorer +中你也可能使用OnMouseUp事件但要多寫幾行代碼)在接收事件的腳本中獲取快捷菜單的UI代碼塊並且將它移動到發生點擊的位置同時設置彈出的panel的 visibilty屬性當用戶在菜單項上點擊時頁面回傳並引發服務器端事件對於服務器而言點擊一個菜單項和點擊一具常規的按鈕沒什麼區別

  當用戶戶想取消已經打開的快捷菜單時怎麼辦呢?在windows程序中按下Esc鍵或者在菜單區域外點擊都可以取消已彈出的快捷菜單所以你必須在Web中實現這一功能請注意只有快捷菜單處於活動(顯示出來)時Esc鍵才有郊因為Esc還可用於其它元素的其它鍵盤快捷方式

  我還可以讓菜單在用戶鼠標移開菜單時隱藏可以通過腳本操作OnMouseLeave 事件實現

  使用彈出菜單控件

  假定我們已以設計出了這個彈出菜單(我們一會兒再說如何實現這個快捷菜單控件)那麼如何使用它在ASPNET頁面中添加一個或多個快捷菜單呢?首先在Visual Studio? NET的工個欄中拖一個或多個快捷菜單控件到頁面上然後為每個菜單添加菜單項並配置每個菜單項的的工具提示命令名(command name)和其它所需的內容例如快捷鍵和幫助主題的鏈接命令名(command name)用於在響應點擊快捷菜單發生頁面回傳時確定是哪一個菜單項被點擊;對每一個快捷菜單控件實例的菜單項集合它必須是唯一的

  你必須在HTML標簽的OnContextMenu事件中加入代碼來彈出快捷菜單代碼必須信賴一系列的參數象點擊的xy坐標點擊的元素和要使用的快捷菜單的實例等注意如果必要你可以使用這種方式完全代替浏覽器的快捷菜單綁定到OnContextMenu事件執行的JavaScript代碼是在運行時動態生成的ContextMenu控件將暴露一個集合屬性來包含分綁定快捷菜單的控件集合在ContextMenu控件將在運行時給這些要綁定的控件一個 oncontextmenu 屬性OK!完成!可以測試了

  慢著讓我們先來想一下ContexMenu控件和頁中任意的顯示快捷菜單的元素的綁定機制這種機制對設計時的支持怎麼樣?理想的情況是根據基類每一個Web控件直接暴露一個 ContextMenuId屬性然後在屬性窗口中選擇這個屬性時將看到在頁面中的ContextMenu控件的列表當然這些ContextMenu控件我們是已經創建了的;ContextMenuId屬性在ASPNET x中不支持在將來的ASPNET中也不支持

  在Visual Studio NET 集成開發環境中ASPNET復合控件可以很好的完成這一工作可以通過使用類撰寫組合現有控件來創作新控件復合控件可呈現一個重新使用現有控件功能的用戶界面復合控件可以從子控件的屬性合成屬性並處理由子控件引發的事件它還可以公開自定義屬性和事件

  我不選擇使用復合控件有以下幾個原因一個是Visual Studio NET 對於Web窗體中的控件功能的擴展支持的不好(請參見Extender provider components in ASPNET: an IExtenderProvider implementation)第二在Visual Studio 的ASPNET設計器中不再支持組件托盤區Web窗體設計器現在僅支持ASPNET控件而忽略象復合控件這樣的非可視化的組件Visual Studio 將不再信賴InitializeComponent節並且不再在代碼文件中自動添任何工具生成(toolgenerated)的代碼ASPNET控件也不設計成具有快捷菜單所以要綁定快捷菜單只能通過快捷菜單控件自身的執行這裡我使用類似ASPNET驗證控件和被驗證控件之間關聯的形式


From:http://tw.wingwit.com/Article/program/net/201311/15260.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.