扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip
原文:扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip

infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的炫目的Windows、Web、WPF和Silverlight控件,相信很多人在使用它们。我们现在的项目就在使用Infragistics的Windows Form控件集。虽然这些控件功能强大,也不可能满足你所有的需求,尤其是那些比较苛刻的最终用户的需求。比如,我们最近就接收到这样一个变态的需求:让所以菜单项、工具栏按钮、网格单元的ToolTip以气球式的样式显示。最终,我不得不通过对现有控件的扩展实现这个要求。

一、扩展UltraGrid

首先介绍对UltraGrid的扩展,先来看看显示的效果:当鼠标移到到每一个单元格(或者列头)的时候,会出现如下一个气球式的ToolTip,其文字的内容为单元格中的文本。ToolTip的样式,包括背景、字体等均可以通过Infragistics控件本身支持的风格文件定义。

下面是扩展控件ExtendedUltraGrid的定义,逻辑比较简单:直接继承自UltraGrid,重写两个方法:OnMouseEnterElement和OnMouseLeaveElement。当鼠标移入和移出相应元素的时候,这两个方法会被调用。通过重写OnMouseEnterElement方法,手工创建UltraToolTipInfo对象,并通过UltraToolTipManager对象(UltraToolTipManager在对象构建的时候被初始化)以ToolTip的形式显示出来;手工创建的ToolTip在OnMouseLeaveElement被执行的时候被移除。此外,由于UltraGrid的单元格和列头本身具有自己的ToolTip,你需要通过DisplayLayout.Override.TipStyleCell和DisplayLayout.Override.TipStyleHeader这两个属性抑制它们的显示。

   1: using Infragistics.Win;
   2: using Infragistics.Win.UltraWinGrid;
   3: using Infragistics.Win.UltraWinToolTip;
   4:  
   5: namespace Artech.ExtendedControls4ToolTip
   6: {
   7:     
   8:     public class ExtendedUltraGrid : UltraGrid    {     
   9:       
  10:         private UltraToolTipManager toolTipManager = new UltraToolTipManager();
  11:         protected override void OnPaint(System.Windows.Forms.PaintEventArgs pe)
  12:         {
  13:             base.OnPaint(pe);
  14:             this.DisplayLayout.Override.TipStyleCell = TipStyle.Hide;
  15:             this.DisplayLayout.Override.TipStyleHeader = TipStyle.Hide;
  16:         }
  17:        
  18:         protected override void OnMouseEnterElement(UIElementEventArgs e)
  19:         {
  20:             UltraGridCell enteredCell = e.Element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
  21:             if (enteredCell != null)
  22:             {
  23:                 if (enteredCell.Column.DataType == typeof(bool))
  24:                 {
  25:                     return;
  26:                 }
  27:  
  28:                 UltraToolTipInfo gridToolTip = new UltraToolTipInfo(enteredCell.Text, ToolTipImage.Default, null, DefaultableBoolean.Default);
  29:                 this.toolTipManager.SetUltraToolTip(this, gridToolTip);
  30:                 this.toolTipManager.ShowToolTip(this);
  31:                 return;
  32:             }
  33:  
  34:             ColumnHeader enteredHeader = e.Element.GetContext(typeof(ColumnHeader)) as ColumnHeader;
  35:             if (enteredHeader != null)
  36:             {
  37:                 enteredHeader.ToolTipText = string.Empty;
  38:                 UltraToolTipInfo gridToolTip = new UltraToolTipInfo(enteredHeader.Caption, ToolTipImage.Default, null, DefaultableBoolean.Default);
  39:                 this.toolTipManager.SetUltraToolTip(this, gridToolTip);
  40:                 this.toolTipManager.ShowToolTip(this);
  41:             }
  42:         }
  43:         
  44:         protected override void OnMouseLeaveElement(UIElementEventArgs e)
  45:         {
  46:             base.OnMouseLeaveElement(e);
  47:             UltraGridCell enteredCell = e.Element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
  48:             ColumnHeader enteredHeader = e.Element.GetContext(typeof(ColumnHeader)) as ColumnHeader;
  49:             if (null != enteredCell || null != enteredHeader)
  50:             {
  51:                 this.toolTipManager.HideToolTip();
  52:             }
  53:         }
  54:     }
  55: }

二、扩展UltraListView

下面是扩展后的UltrlListView(在Detail模式)的ToolTip显示的样式,ExtendedUltraGrid差不多:当鼠标移到相应的ListViewItem上面,将相应的内容以气球式的ToolTip实现出来。

扩展后的ExtendedUltrlListView的实现与ExtendedUltraGrid基本上完全一样,通过是对OnMouseEnterElement和OnMouseLeaveElement这两个方法的重写来实现,为了抑制UltrlListView自身的ToolTip的显示,需要将ViewSettingsDetails.SubItemTipStyle和ItemSettings.TipStyle两个属性设置为ItemTipStyle.Hide。下面是具体的代码定义:

   1: using System.Windows.Forms;
   2: using Infragistics.Win;
   3: using Infragistics.Win.UltraWinListView;
   4: using Infragistics.Win.UltraWinToolTip;
   5:  
   6: namespace Artech.ExtendedControls4ToolTip
   7: {
   8:   
   9:     public class ExtendedUltraListView : UltraListView
  10:     {
  11:         private UltraToolTipManager toolTipManager = new UltraToolTipManager();       
  12:        
  13:         protected override void OnPaint(PaintEventArgs eventArgs)
  14:         {
  15:             base.OnPaint(eventArgs);
  16:             this.ViewSettingsDetails.SubItemTipStyle = SubItemTipStyle.Hide;
  17:             this.ItemSettings.TipStyle = ItemTipStyle.Hide;
  18:         }
  19:        
  20:         protected override void OnMouseEnterElement(UIElementEventArgs e)
  21:         {
  22:             base.OnMouseEnterElement(e);
  23:             UltraListViewItem enteredItem = e.Element.GetContext(typeof(UltraListViewItem)) as UltraListViewItem;
  24:             if (enteredItem != null)
  25:             {
  26:                 UltraToolTipInfo toolTip = new UltraToolTipInfo(enteredItem.Text, ToolTipImage.Default, null, DefaultableBoolean.Default);
  27:                 this.toolTipManager.SetUltraToolTip(this, toolTip);
  28:                 this.toolTipManager.ShowToolTip(this);
  29:             }
  30:         }
  31:        
  32:         protected override void OnMouseLeaveElement(UIElementEventArgs e)
  33:         {
  34:             base.OnMouseLeaveElement(e);
  35:             UltraListViewItem enteredItem = e.Element.GetContext(typeof(UltraListViewItem)) as UltraListViewItem;
  36:             if (null != enteredItem)
  37:             {
  38:                 this.toolTipManager.HideToolTip();
  39:             }
  40:         }
  41:     }
  42: }

三、扩展UltraToolbarsManager

右图是应用了扩展后的UltraToolbarsManager,工具栏ToolTip显示的样式,实际上当通过鼠标选择某个菜单项的时候,也具有相同样式的Tooltip相识。如果仔细看的话,你还会发现ToolTip的背景和上面默认的颜色不一样,这是因为在程序初始化后设置了样式。ToolTip的样式也随之发生了变化,以与整个风格相匹配。

扩展后的ExtendedUltraToolbarsManager的实现与上面的方式类似,同样是通过重写OnMouseEnterElement和OnMouseLeaveElement这两个方法。不过有一点不同的是:用于显示ToolTip的ToolTipManager的ShowToolTip接收参数的类型为Control,但是UltraToolbarsManager本身却并不是从Control类型派生。在这里采用了一个变通的方式:定义了一个Control类型的属性ContainerToBindToolTip,通过该属性从外部注定一个绑定ToolTip的控件。ExtendedUltraToolbarsManager定义如下:

   1: using System.ComponentModel;
   2: using System.Windows.Forms;
   3: using Infragistics.Win;
   4: using Infragistics.Win.UltraWinToolbars;
   5: using Infragistics.Win.UltraWinToolTip;
   6:  
   7: namespace Artech.ExtendedControls4ToolTip
   8: { 
   9:     public class ExtendedUltraToolbarsManager : UltraToolbarsManager
  10:     {
  11:         
  12:         private UltraToolTipManager toolTipManager = new UltraToolTipManager();
  13:       
  14:         public Control ContainerToBindToolTip
  15:         { get; set; }      
  16:  
  17:     
  18:         public ExtendedUltraToolbarsManager(IContainer container)
  19:             : base(container)
  20:         {
  21:             this.toolTipManager = new UltraToolTipManager();
  22:         }
  23:        
  24:         protected override void OnMouseEnterElement(UIElementEventArgs e)
  25:         {
  26:             base.OnMouseEnterElement(e);
  27:             if (this.ShowToolTips)
  28:             {
  29:                 this.ShowToolTips = false;
  30:             }
  31:  
  32:             ToolBase tool = e.Element.GetContext(typeof(ToolBase)) as ToolBase;
  33:             if (null != tool)
  34:             {
  35:                 UltraToolTipInfo toolTip = new UltraToolTipInfo(tool.CaptionResolved.Replace("&", string.Empty), ToolTipImage.Default, null, DefaultableBoolean.Default);
  36:                 if (null != this.ContainerToBindToolTip)
  37:                 {
  38:                     this.toolTipManager.SetUltraToolTip(ContainerToBindToolTip, toolTip);
  39:                     this.toolTipManager.ShowToolTip(ContainerToBindToolTip);
  40:                 }
  41:             }
  42:         }
  43:         
  44:         protected override void OnMouseLeaveElement(UIElementEventArgs e)
  45:         {
  46:             base.OnMouseLeaveElement(e);
  47:             ToolBase tool = e.Element.GetContext(typeof(ToolBase)) as ToolBase;
  48:             if (null != tool)
  49:             {
  50:                 this.toolTipManager.HideToolTip();
  51:             }
  52:         }
  53:     }
  54: }

作者:Artech
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted on 2014-11-04 22:48 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4075089.html

扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip相关推荐

  1. 使用SharpKit构建客户端Grid控件

    目录 介绍 实现Grid Grid类 GridRow类 添加一行 从模板创建行元素 使用Grid 实现排序 优化Grid 兴趣点 下载源41.33 KB 下载SharpKit 介绍 此示例代码将向您展 ...

  2. WPF 控件专题 Grid 控件详解

    1.Grid 介绍 定义由列和行组成的灵活的网格区域,Grid顾名思义就是"网格",它的子控件被放在一个一个实现定义好的小格子里面,整齐配列,该对象可包含多个 Children对象 ...

  3. Winforms 2020界面开发新纪元——Map、Pivot Grid控件升级

    DevExpress WinForms Subscription拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案.DevExpress WinForms能完美构 ...

  4. Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】

    前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...

  5. wpf研究之道-grid控件

    想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...

  6. fine ui grid控件添加行号

    grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...

  7. android cbox listview特效,关于Listview和Checkbox控件嵌套出现的各种问题(Recyclerview也适用)...

    前言 随着安卓开发的深入了解,越来越发现,很多看似简单的东西,在没有思路的情况下,盲目去写,会发现写到最后,连自己都感觉各种漏洞和问题, 其实这个问题也是我的亲身经历, 当初我在面对Listview和 ...

  8. wxpython中grid控件一些用法总结

    1. 官网主动查找控件的使用方法 wxpython中grid控件的用法可以通过搜索wxpython网址查看使用方法说明.网址:https://docs.wxpython.org/index.html ...

  9. fineui grid ajax,基于FineUI Grid控件添加右键菜单

    FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...

最新文章

  1. 解析深度学习:卷积神经网络原理与视觉实践
  2. javascript:函数的apply,call方法和length属性
  3. C# access update 出错总结,注意事项
  4. bo65连oracle报服务不响应,ORACLE常见问题一千问[1至100]
  5. Python chardet 字符编码判断
  6. Net设计模式实例之代理模式(Proxy Pattern)
  7. Log-Polar——关于对数极坐标
  8. Linux查看opencv版本
  9. Ubuntu: 使用U盘拷贝文件
  10. 数学建模学习:因子分析
  11. ABAP BYPASSING BUFFER 及 表缓存,缓冲概念 SAP
  12. Fabric.js IText 手动设置斜体
  13. 山东专科学校排名计算机类,2017计算机专科学校排名一览表,2017计算机专科学校排名一览表...
  14. 计算机技术的发展包括几个阶段,目前电子计算机处于哪个阶段?计算机发展的四个阶段...
  15. Color correction matrix(色彩矩阵)的学习思考
  16. 【美文欣赏】给爱子的信
  17. 使用计算机解决科学研究,应用计算机科学
  18. IELTS writing skills——学习笔记
  19. UVALive 4126 Password Suspects(AC自动机+dp)
  20. duet连win10,duetdisplay这个软件在win10上用不了?安装vs2015的时候想取消安装没有点取消...

热门文章

  1. python可以干嘛知乎-一行Python代码能做什么?
  2. python程序设计报告-20194115 实验二《Python程序设计》实验报告
  3. python详细安装教程linux-python 在linux系统的安装教程
  4. python读取excel某一列内容-Python读取Excel数据并根据列名取值
  5. 零基础代码学python-零基础学Python 超详细教程
  6. 案例驱动python编程入门-用Python进行行为驱动开发的入门教程
  7. 学习python需要什么基础-学习python需要什么基础
  8. python编程入门经典实例-总算明了python编程入门经典实例
  9. python.freelycode.com-Python数据可视化2018:为什么这么多的库?
  10. python怎么导入包-Python 包的引入顺序到底是怎样的?