閱讀778 返回首頁    go 阿裏雲 go 技術社區[雲棲]


擴展ToolBarManager、ListView和Grid控件以實現氣球式的ToolTip

infragistics是全球領先的UI工具和用戶體驗的專家,Infragistics開發了一係列的炫目的Windows、Web、WPF和Silverlight控件,相信很多人在使用它們。我們現在的項目就在使用Infragistics的Windows Form控件集。雖然這些控件功能強大,也不可能滿足你所有的需求,尤其是那些比較苛刻的最終用戶的需求。比如,我們最近就接收到這樣一個變態的需求:讓所以菜單項、工具欄按鈕、網格單元的ToolTip以氣球式的樣式顯示。最終,我不得不通過對現有控件的擴展實現這個要求。

一、擴展UltraGrid

image 首先介紹對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: }

image下麵是擴展後的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

image

右圖是應用了擴展後的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

  上一篇:go  WCF版的PetShop之二:模塊中的層次劃分[提供源代碼下載]
  下一篇:go  [轉]如何解決事件導致的Memory Leak問題:Weak Event Handlers