如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持

翻译|其它|编辑:郝浩|2007-10-23 11:20:10.000|阅读 1184 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

最近由于工作需要,研究了一下如何将第三方控件嵌入到 ToolStrip 控件中,并能提供 Design-Time 下的支持。

下面将详细讲解如何把系统的 MonthCalendar 控件嵌入到 ToolStrip 控件中。

以下的两幅图片显示了最终的样子.

Run-Time下的样子 1

Design-Time下的样子 1

 
如何将第三方控件嵌入到 ToolStrip

微软实现了一个 ToolStripControlHost 类, 它是 ToolStripComboBox, ToolStripTextBox, 和 ToolStripProgressBar 等的基类. ToolStripControlHost 提供了将第三方控件嵌入 ToolStrip 的能力. 我们可以用两种方式使用它:

一, 我们可以直接将继承自 Control 类的第三方控件作为 ToolStripControlHost 的构造函数的参数构造一个 ToolStripControlHost 实例, 将这个实例直接作为 ToolStrip 的 Item 加到 ToolStrip 的 Items 集合中使用即可.

        private void Form2_Load(object sender, EventArgs e)

        {

            MonthCalendar monthCalendar = new MonthCalendar();

            monthCalendar.FirstDayOfWeek = Day.Monday;

            this.toolStrip1.Items.Add(new ToolStripControlHost(monthCalendar));

        }
 

二, 从 ToolStripControlHost 派生, 在继承类默认参构造函数中将第三方控件作为参数调用基类的有参构造函数. 这种方式可以很容易的在继承类中暴露属性,方法和事件,便于访问.

实现步骤如下:

1, 扩展 ToolStripControlHost。实现一个调用传入所需控件的基类构造函数的默认构造函数。

        public ToolStripMonthCalendar() : base(new MonthCalendar())

        {

        }
 
2, 声明一个与包装控件相同类型的属性,并在属性访问器中返回  Control  作为正确类型的控件。

        public MonthCalendar MonthCalendarControl

        {

            get

            {

                return base.Control as MonthCalendar;

            }

        }
 
 

3, 使用扩展类中的属性和方法公开包装控件的其他常用属性和方法。

        // Expose the MonthCalendar.FirstDayOfWeek as a property.

        public Day FirstDayOfWeek

        {

            get

            {

                return this.MonthCalendarControl.FirstDayOfWeek;

            }

            set

            {

                value = this.MonthCalendarControl.FirstDayOfWeek;

            }

        }

 

        // Expose the AddBoldedDate method.

        public void AddBoldedDate(DateTime dateToBold)

        {

            this.MonthCalendarControl.AddBoldedDate(dateToBold);

        }
 
 

4, 也可以选择重写 OnSubscribeControlEvents 和 OnUnsubscribeControlEvents 方法,并添加要公开的控件事件。

        // Subscribe and unsubscribe the control events you wish to expose.

        protected override void OnSubscribeControlEvents(Control c)

        {

            // Call the base so the base events are connected.

            base.OnSubscribeControlEvents(c);

 

            // Cast the control to a MonthCalendar control.

            MonthCalendar monthCalendarControl = (MonthCalendar)c;

 

            // Add the event.

            monthCalendarControl.DateChanged += new DateRangeEventHandler(OnDateChanged);

        }

 

        protected override void OnUnsubscribeControlEvents(Control c)

        {

            // Call the base method so the basic events are unsubscribed.

            base.OnUnsubscribeControlEvents(c);

 

            // Cast the control to a MonthCalendar control.

            MonthCalendar monthCalendarControl = (MonthCalendar)c;

 

            // Remove the event.

            monthCalendarControl.DateChanged -= new DateRangeEventHandler(OnDateChanged);

        }
 


5, 为要公开的事件提供必要的包装。

        // Declare the DateChanged event.

        public event DateRangeEventHandler DateChanged;

       

// Raise the DateChanged event.

        private void OnDateChanged(object sender, DateRangeEventArgs e)

        {

            if (DateChanged != null)

            {

                DateChanged(this, e);

            }

        }
 

如何提供设计时的支持

1, 为从 ToolStripControlHost 继承的类添加 ToolStripItemDesignerAvailabilityAttribute 标签. 它可以使 ToolStrip 在 Design-Time 下能够找到从 ToolStripControlHost 继承的第三方控件, 直接效果就是第三方控件在下拉菜单中可以直接列举出来. 另外,除了可以将第三方控件嵌入 ToolStrip 外, 我们还可以直接将第三方控件嵌入到 ContextMenuStrip, MenuStrip 和 StatusStrip 中.

ToolStripItemDesignerAvailability 枚举成员如下:

 

成员名称

说明

 

All

指定所有控件均可见。 

 

ContextMenuStrip

指定 ContextMenuStrip 是可见的。 

 

MenuStrip

指定 MenuStrip 是可见的。 

 

None

指定无任何控件可见。 

 

StatusStrip

指定 StatusStrip 是可见的。 

 

ToolStrip

指定 ToolStrip 是可见的。 

2, 为继承的控件添加 ToolboxBitmapAttribute 标签改变默认 Icon.

    [ToolboxBitmap(typeof(MonthCalendar))]

    [DefaultProperty("Value")]

    [ToolStripItemDesignerAvailability(

        ToolStripItemDesignerAvailability.ContextMenuStrip |

        ToolStripItemDesignerAvailability.MenuStrip |

        ToolStripItemDesignerAvailability.StatusStrip |

        ToolStripItemDesignerAvailability.ToolStrip)]

    public class ToolStripMonthCalendar : ToolStripControlHost

    {


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP