原文:扩展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

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

扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip的更多相关文章

  1. 完全使用一组 DSL 来操作 Grid 控件

    最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...

  2. FineUI Grid控件高度自适应

    引言 页面里使用f:Grid控件,添加分页功能,然后高度填充整个页面. 如何使用 使用FineUI 控件的每个页面都有一个f:PageManager控件,它包含属性:AutoSizePanelID,设 ...

  3. WPF平台Grid控件性能比较

    WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...

  4. FineUI Grid控件右键菜单的实现

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

  5. 实现控件WPF(4)----Grid控件实现六方格

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 利用Grid控件能很轻松帮助我们实现各种布局.上面就是一个通过Grid单元格 ...

  6. wpf研究之道-grid控件

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

  7. Grid控件

    Grid控件是WPF布局容器中功能最强大.最灵活的控件.Grid控件基本上能够完成其他WPF容器控件所能完成的功能,Microsoft建议大多数界面的布局都使用Grid控件来实现,因此默认情况下.vs ...

  8. 让ListView中的控件失去焦点:android:descendantFocusability="blocksDescendants"

    值得注意的是,ListView中的控件不能设置clickable="true",否则会无视父控件的blockDescendants. 可参考: https://segmentfau ...

  9. fine ui grid控件添加行号

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

随机推荐

  1. EnumMap demo

    优点:常量做为Key,在编译期就确定了.Enum做为key,在运行时也可以改变 package enumdemo; import java.util.EnumMap; import java.util ...

  2. bootstrap之Click大事

    上一篇文章中谈到了bootstrap流程,本文开始把目光bootstrap它可以接受指令(从源代码视图的透视.因为appium该项目现在还处于不断更新,因此,一些指令已经实现.也许未来会实现一些.从视 ...

  3. web架构设计经验分享(转)

    本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查 ...

  4. Cordic 算法的原理介绍

    cordic 算法知道正弦和余弦值,求反正切,即角度. 采用用不断的旋转求出对应的正弦余弦值,是一种近似求解发. 旋转的角度很讲求,每次旋转的角度必须使得 正切值近似等于 1/(2^N).旋转的目的是 ...

  5. HDU 4085 Steiner树模板称号

    Dig The Wells Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. jquery中 $ 和 jQuery 及 $() 的差别

    用过jquery的人都知道,jquery有两种使用方法,一种是$,另一种是jQuery,那么这两种方式在使用上有什么差别呢? 答案是这两种使用方法没什么差别,仅仅是别名而已,用$要比jQuery简短一 ...

  7. CSM认证培训知识汇总

    后两天的CSM训练.我们非常颠覆旧观念,有关的一些观点的简要培训记录: 约定大于监管:监督是管理水平.或旧有格局,该公约是一个团队与自己的法规. 工具:传统的管理工具和服务经理,还有许多人是PM正在使 ...

  8. Codeforces 135A-Replacement(思维)

    A. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  9. Spring搭建MVC WEB项目[转]

    原文链接:http://blog.csdn.net/initphp/article/details/8208349 1.创建一个web项目 2.假设,我们已经安装完毕Spring所需要的依赖包,以及一 ...

  10. SEO要领:8文章主持技巧(两)

    续篇:搜索引擎优化要领:8条辅助技巧(一) 四.检查你的robots.txt文件 与谷歌的蜘蛛通信的经常用法是使用robots.txt文件. 这是一个文本文件.同意你告诉搜索引擎,你的站点的网页上抓取 ...