扩展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: }
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip的更多相关文章
- 完全使用一组 DSL 来操作 Grid 控件
最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...
- FineUI Grid控件高度自适应
引言 页面里使用f:Grid控件,添加分页功能,然后高度填充整个页面. 如何使用 使用FineUI 控件的每个页面都有一个f:PageManager控件,它包含属性:AutoSizePanelID,设 ...
- WPF平台Grid控件性能比较
WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...
- FineUI Grid控件右键菜单的实现
FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...
- 实现控件WPF(4)----Grid控件实现六方格
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 利用Grid控件能很轻松帮助我们实现各种布局.上面就是一个通过Grid单元格 ...
- wpf研究之道-grid控件
想要说些什么,却不知道从哪开始."形而上谓之道,形而下谓之器".与其坐而论道,不如脚踏实地,从最实用的地方开始. 我们先来看看wpf中的grid控件.grid控件是个网格的布局控件 ...
- Grid控件
Grid控件是WPF布局容器中功能最强大.最灵活的控件.Grid控件基本上能够完成其他WPF容器控件所能完成的功能,Microsoft建议大多数界面的布局都使用Grid控件来实现,因此默认情况下.vs ...
- 让ListView中的控件失去焦点:android:descendantFocusability="blocksDescendants"
值得注意的是,ListView中的控件不能设置clickable="true",否则会无视父控件的blockDescendants. 可参考: https://segmentfau ...
- fine ui grid控件添加行号
grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...
随机推荐
- android 内存泄漏分析技巧
java虚拟机执行一般都有一个内存界限,超过这个界限,就会报outofmemory.这个时候一般都是存在内存泄漏.解决内存泄漏问题,窃以为分为两个步骤:分析应用程序是否真的有内存泄漏,找到内存泄漏的地 ...
- Androids含文档erver结束(工具包 Httputils)两
在同server在...的基础上,本文client还登录界面 Andriod简单http get请求基础上,用户注冊后跳转到下载界面,本文下载界面仅仅有两个View,一个是textView显示注冊后u ...
- 金蝶K3管理软件PDA条码解决方式,盘点机与金蝶K3无缝对接
申明:以上文字为"武汉汉码科技有限公司"原创,转载时务必注明出处. 技术分享,沟通你我,共同进步!www.hanma-scan.com 原帖:http://www.hanma-sc ...
- hadoop2.0的datanode数据存储文件夹策略的多个副本
在hadoop2.0在,datanode数据存储盘选择策略有两种方式复制: 首先是要遵循hadoop1.0磁盘文件夹投票,实现类:RoundRobinVolumeChoosingPolicy.java ...
- 文件类似的推理 -- 超级本征值(super feature)
基于内容的变长分块(CDC)技术,能够用来对文件进行变长分块.而后用来进行反复性检測,广泛用于去重系统中.后来又出现了对相似数据块进行delta压缩,进一步节省存储开销. 所以就须要一种高效 ...
- linux Apache安装
原文:linux Apache安装 1. 下载apache,http://httpd.apache.org/download.cgi 通过这个官方网站,我们可以下到最新的版本.现在版本都 ...
- 【iOS开展-94】xcode6如何使用GIT以及如何添加太老项目GIT特征?
(1)对于一个新项目:如何使用GIT?在新项目的过程,例如,您可以选择下面的复选框. (2)针对老项目,加入GIT功能. --在终端.cd到项目文件夹 --然后输入git init,初始化一个.git ...
- decimal system 2016
Problem Description As we know , we always use the decimal system in our common life, even using the ...
- 网页上弹出pop窗口实例,(document).height()与$(window).height()的区别
#dvbg{background-color:#666666; position:absolute; z-index:99; left:0; top:0; display:none; width:10 ...
- c/c++和java达到swap不同功能
首先我们来看看c/c++实施swap性能 void swap ( int & a, int & b) { int Temp; temp = a; a = b; b = temp; } ...