778
技術社區[雲棲]
擴展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: }
下麵是擴展後的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: }
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-30 11:04:28