为ASP.NET控件加入快捷菜单




  虽然快捷菜单在桌面应用中已经是非常通用元素但是由于在象ASP.NET这样基于服务器技术没有很好描绘所以在Web应用中快捷菜单并不是很通用要想使用快捷菜单浏览器必须高度支持DHTML和丰富事件模式,例如:Microsoft? Internet Explorer 5.0及更高版本或者Netscape 6.0等然而各种浏览器对象模式虽然功能上大至相同但是成员各名字却各不相同这就需要我们自己实现对象和事件种模式到到另种模式转换
  
 

  
 

  这里我们创建个针到Internet Explorer对象模式ASP.NET快捷菜单接着我将经过修改使其功能支持其它浏览器代码支持ASP.NET 1.x,也可以在ASP.NET2.0 Beta1下编译通过 Outline of the
  
  ContextMenu Control 快捷菜单Control控件概述:
  
  MSDN Liabrary 中包含了几个DHTML快捷菜单举例分别提供了对这功能不能实现思路方法个快捷菜单就是在页面中任何位置组标记代码它包括两部分内容——界面和脚本(当用户在页面右击时关联UI)UI提供个可点击元素列表——菜单项——和各自内容文本图标命令名(command name),目标url提示(tooltip)和所有你认为有必要显示出来东西快捷菜单界面是页面部分并且属于页面Control控件树中(太多快捷菜单将会出现执行问题:和大多数用户常规情况相比ASP.NET将发送更多快捷菜单到浏览器)当用户在页面个元素上右击时将引发段JavaScript,这段脚本将快捷菜单移动到右击位置显示
  
  快捷菜单将保持隐藏属性只有当用户在页面个绑定个快捷菜单元素上右击时快捷菜单才显示页面元素接收脚本事件并弹出个快捷菜单作为响应脚本事件信赖于浏览器在Internet Explorer 5.0和更新版本中是 OnContexMenu事件.在Netscape6.0和更新版本中你要使用 OnMouseUp 事件(在Internet Explorer 5.0+中你也可能使用OnMouseUp事件但要多写几行代码)在接收事件脚本中获取快捷菜单UI代码块并且将它移动到发生点击位置同时设置弹出panel visibilty属性当用户在菜单项上点击时页面回传并引发服务器端事件对于服务器而言点击个菜单项和点击具常规按钮没什么区别
  
  当用户户想取消已经打开快捷菜单时如何办呢?在windows按下Esc键或者在菜单区域外点击都可以取消已弹出快捷菜单所以你必须在Web中实现这功能请注意只有快捷菜单处于活动(显示出来)时Esc键才有郊Esc还可用于其它元素其它键盘快捷方式
  
  我还可以让菜单在用户鼠标移开菜单时隐藏可以通过脚本操作 OnMouseLeave 事件实现
  
  使用弹出菜单Control控件
  
  假定我们已以设计出了这个弹出菜单(我们会儿再说如何实现这个快捷菜单Control控件)那么如何使用它在ASP.NET页面中添加个或多个快捷菜单呢?首先在Visual Studio? .NET工个栏中拖个或多个快捷菜单Control控件到页面上然后为每个菜单添加菜单项并配置每个菜单项工具提示命令名(command name)和其它所需内容例如快捷键和帮助主题链接命令名(command name)用于在响应点击快捷菜单发生页面回传时确定是哪个菜单项被点击;对每个快捷菜单Control控件例子菜单项集合它必须是唯
  
  你必须在HTML标签OnContextMenu事件中加入代码来弹出快捷菜单代码必须信赖系列参数象点击x,y坐标点击元素和要使用快捷菜单例子等注意:如果必要你可以使用这种方式完全代替浏览器快捷菜单绑定到OnContextMenu事件执行JavaScript代码是在运行时动态生成ContextMenuControl控件将暴露个集合属性来包含分绑定快捷菜单Control控件集合在ContextMenuControl控件将在运行时给这些要绑定Control控件个 oncontextmenu 属性OK!完成!可以测试了
  
  慢着让我们先来想下ContexMenuControl控件和页中任意显示快捷菜单元素绑定机制这种机制对设计时支持如何样?理想情况是:根据基类每个WebControl控件直接暴露个 ContextMenuId属性然后在属性窗口中选择这个属性时将看到在页面中ContextMenuControl控件列表当然这些ContextMenuControl控件我们是已经创建了;ContextMenuId属性在ASP.NET 1.x中不支持在将来ASP.NET2.0中也不支持
  
  在Visual Studio .NET 2003 集成开发环境中ASP.NET复合Control控件可以很好完成这工作可以通过使用类撰写组合现有Control控件来创作新Control控件复合Control控件可呈现个重新使用现有Control控件功能用户界面复合Control控件可以从子Control控件属性合成属性并处理由子Control控件引发事件它还可以公开自定义属性和事件
  
  我不选择使用复合Control控件有以下几个原因:个是Visual Studio .NET 2003对于Web窗体中Control控件功能扩展支持不好(请参见:Extender provider components in ASP.NET: an IExtenderProvider implementation)第 2在Visual Studio 2005ASP.NET设计器中不再支持组件托盘区Web窗体设计器现在仅支持ASP.NETControl控件而忽略象复合Control控件这样非可视化组件Visual Studio 2005将不再信赖InitializeComponent节并且不再在代码文件中自动添任何工具生成(tool-generated)代码ASP.NETControl控件也不设计成具有快捷菜单所以要绑定快捷菜单只能通过快捷菜单Control控件自身执行这里我使用类似ASP.NET验证Control控件和被验证Control控件的间关联形式
Tags: 

延伸阅读

最新评论

发表评论