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

我们最近就接收到这样一个变态的需求:让所以菜单项、工具栏按钮、网格单元的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这两个属性抑制它们的显示。

using Infragistics.Win;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win.UltraWinToolTip;

namespace Artech.ExtendedControls4ToolTip
{

    public class ExtendedUltraGrid : UltraGrid    
    {         

        private UltraToolTipManager toolTipManager = new UltraToolTipManager();

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs pe)
        {

            base.OnPaint(pe);

            this.DisplayLayout.Override.TipStyleCell = TipStyle.Hide;

            this.DisplayLayout.Override.TipStyleHeader = TipStyle.Hide;
        }

       

        protected override void OnMouseEnterElement(UIElementEventArgs e)
        {
            UltraGridCell enteredCell = e.Element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
            if (enteredCell != null)
            {
                if (enteredCell.Column.DataType == typeof(bool))
                {
                    return;
                }

                UltraToolTipInfo gridToolTip = new UltraToolTipInfo(enteredCell.Text, ToolTipImage.Default, null, DefaultableBoolean.Default);
                this.toolTipManager.SetUltraToolTip(this, gridToolTip);
                this.toolTipManager.ShowToolTip(this);
                return;
            }

            ColumnHeader enteredHeader = e.Element.GetContext(typeof(ColumnHeader)) as ColumnHeader;

            if (enteredHeader != null)
            {
                enteredHeader.ToolTipText = string.Empty;
                UltraToolTipInfo gridToolTip = new UltraToolTipInfo(enteredHeader.Caption, ToolTipImage.Default, null, DefaultableBoolean.Default);
                this.toolTipManager.SetUltraToolTip(this, gridToolTip);
                this.toolTipManager.ShowToolTip(this);
            }

        }

        

        protected override void OnMouseLeaveElement(UIElementEventArgs e)
        {
            base.OnMouseLeaveElement(e);
            UltraGridCell enteredCell = e.Element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
            ColumnHeader enteredHeader = e.Element.GetContext(typeof(ColumnHeader)) as ColumnHeader;
            if (null != enteredCell || null != enteredHeader)
            {
                this.toolTipManager.HideToolTip();
            }
        }

    }

}

二、扩展UltraListView

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

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

 

using System.Windows.Forms;

using Infragistics.Win;

using Infragistics.Win.UltraWinListView;

using Infragistics.Win.UltraWinToolTip;

 

namespace Artech.ExtendedControls4ToolTip

{

  

    public class ExtendedUltraListView : UltraListView

    {

        private UltraToolTipManager toolTipManager = new UltraToolTipManager();       

       

        protected override void OnPaint(PaintEventArgs eventArgs)

        {

            base.OnPaint(eventArgs);

            this.ViewSettingsDetails.SubItemTipStyle = SubItemTipStyle.Hide;

            this.ItemSettings.TipStyle = ItemTipStyle.Hide;

        }

       

        protected override void OnMouseEnterElement(UIElementEventArgs e)

        {

            base.OnMouseEnterElement(e);

            UltraListViewItem enteredItem = e.Element.GetContext(typeof(UltraListViewItem)) as UltraListViewItem;

            if (enteredItem != null)

            {

                UltraToolTipInfo toolTip = new UltraToolTipInfo(enteredItem.Text, ToolTipImage.Default, null, DefaultableBoolean.Default);

                this.toolTipManager.SetUltraToolTip(this, toolTip);

                this.toolTipManager.ShowToolTip(this);

            }

        }

       

        protected override void OnMouseLeaveElement(UIElementEventArgs e)

        {

            base.OnMouseLeaveElement(e);

            UltraListViewItem enteredItem = e.Element.GetContext(typeof(UltraListViewItem)) as UltraListViewItem;

            if (null != enteredItem)

            {

                this.toolTipManager.HideToolTip();

            }

        }

    }

}

三、扩展UltraToolbarsManager

image

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

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

using System.ComponentModel;

using System.Windows.Forms;

using Infragistics.Win;

using Infragistics.Win.UltraWinToolbars;

using Infragistics.Win.UltraWinToolTip;

 

namespace Artech.ExtendedControls4ToolTip

{ 

    public class ExtendedUltraToolbarsManager : UltraToolbarsManager

    {

        

        private UltraToolTipManager toolTipManager = new UltraToolTipManager();

      

        public Control ContainerToBindToolTip

        { get; set; }      

 

    

        public ExtendedUltraToolbarsManager(IContainer container)

            : base(container)

        {

            this.toolTipManager = new UltraToolTipManager();

        }

       

        protected override void OnMouseEnterElement(UIElementEventArgs e)

        {

            base.OnMouseEnterElement(e);

            if (this.ShowToolTips)

            {

                this.ShowToolTips = false;

            }

 

            ToolBase tool = e.Element.GetContext(typeof(ToolBase)) as ToolBase;

            if (null != tool)

            {

                UltraToolTipInfo toolTip = new UltraToolTipInfo(tool.CaptionResolved.Replace("&", string.Empty), ToolTipImage.Default, null, DefaultableBoolean.Default);

                if (null != this.ContainerToBindToolTip)

                {

                    this.toolTipManager.SetUltraToolTip(ContainerToBindToolTip, toolTip);

                    this.toolTipManager.ShowToolTip(ContainerToBindToolTip);

                }

            }

        }

        

        protected override void OnMouseLeaveElement(UIElementEventArgs e)

        {

            base.OnMouseLeaveElement(e);

            ToolBase tool = e.Element.GetContext(typeof(ToolBase)) as ToolBase;

            if (null != tool)

            {

                this.toolTipManager.HideToolTip();

            }

        }

    }

}

共有0个回答