找回密码
 立即注册

QQ登录

只需一步,快速开始

thrall

超级版主

14

主题

174

帖子

2026

积分

超级版主

Rank: 8Rank: 8

积分
2026

活字格认证微信认证勋章

thrall
超级版主   /  发表于:2013-5-3 16:53  /   查看:7012  /  回复:0
最近研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.

下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.
以下的两幅图片显示了最终的样子.


Run-Time下的样子


Design-Time下的样子

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

一, 我们可以直接将继承自Control类的第三方控件作为ToolStripControlHost的构造函数的参数构造一个ToolStripControlHost实例, 将这个实例直接作为ToolStrip的Item加到ToolStrip的Items集合中使用即可.
  1. private void Form2_Load(object sender, EventArgs e)
  2. {
  3.     MonthCalendar monthCalendar = new MonthCalendar();
  4.     monthCalendar.FirstDayOfWeek = Day.Monday;
  5.     this.toolStrip1.Items.Add(new ToolStripControlHost(monthCalendar));
  6. }
复制代码
二, 从ToolStripControlHost派生, 在继承类默认参构造函数中将第三方控件作为参数调用基类的有参构造函数. 这种方式可以很容易的在继承类中暴露属性,方法和事件,便于访问.实现步骤如下:
1, 扩展 ToolStripControlHost。实现一个调用传入所需控件的基类构造函数的默认构造函数。
  1. public ToolStripMonthCalendar() : base(new MonthCalendar())
  2. {

  3. }
复制代码

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



  1. public MonthCalendar MonthCalendarControl
  2. {
  3.     get
  4.     {
  5.         return base.Control as MonthCalendar;
  6.     }
  7. }
复制代码

3, 使用扩展类中的属性和方法公开包装控件的其他常用属性和方法。
  1. // Expose the MonthCalendar.FirstDayOfWeek as a property.
  2. public Day FirstDayOfWeek
  3. {
  4.     get
  5.     {
  6.          return this.MonthCalendarControl.FirstDayOfWeek;
  7.     }
  8.     set
  9.     {
  10.         value = this.MonthCalendarControl.FirstDayOfWeek;
  11.     }
  12. }


  13. // Expose the AddBoldedDate method.
  14. public void AddBoldedDate(DateTime dateToBold)
  15. {
  16.      this.MonthCalendarControl.AddBoldedDate(dateToBold);
  17. }
复制代码

4, 也可以选择重写 OnSubscribeControlEvents 和 OnUnsubscribeControlEvents 方法,并添加要公开的控件事件。
  1. // Subscribe and unsubscribe the control events you wish to expose.
  2. protected override void OnSubscribeControlEvents(Control c)
  3. {
  4.     // Call the base so the base events are connected.
  5.     base.OnSubscribeControlEvents(c);

  6.     // Cast the control to a MonthCalendar control.
  7.     MonthCalendar monthCalendarControl = (MonthCalendar)c;

  8.     // Add the event.
  9.     monthCalendarControl.DateChanged += new DateRangeEventHandler(OnDateChanged);
  10. }

  11. protected override void OnUnsubscribeControlEvents(Control c)
  12. {
  13.     // Call the base method so the basic events are unsubscribed.
  14.     base.OnUnsubscribeControlEvents(c);


  15.     // Cast the control to a MonthCalendar control.
  16.     MonthCalendar monthCalendarControl = (MonthCalendar)c;


  17.     // Remove the event.
  18.     monthCalendarControl.DateChanged -= new DateRangeEventHandler(OnDateChanged);
  19. }
复制代码

5, 为要公开的事件提供必要的包装。
  1. // Declare the DateChanged event.

  2. public event DateRangeEventHandler DateChanged;
  3.         

  4. // Raise the DateChanged event.

  5. private void OnDateChanged(object sender, DateRangeEventArgs e)
  6. {
  7.     if (DateChanged != null)
  8.     {
  9.         DateChanged(this, e);
  10.     }
  11. }
复制代码

完整的示例请参见MSDN(http://msdn2.microsoft.com/en-us/library/9k5etstz.aspx ).如何提供设计时的支持
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.
  1. [ToolboxBitmap(typeof(MonthCalendar))]
  2. [DefaultProperty("Value")]
  3. [ToolStripItemDesignerAvailability(
  4.     ToolStripItemDesignerAvailability.ContextMenuStrip |
  5.     ToolStripItemDesignerAvailability.MenuStrip |
  6.     ToolStripItemDesignerAvailability.StatusStrip |
  7.     ToolStripItemDesignerAvailability.ToolStrip)]
  8. public class ToolStripMonthCalendar : ToolStripControlHost
  9. {
  10.        //TODO: ......
  11. }
复制代码





The End

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部