找回密码
 立即注册

QQ登录

只需一步,快速开始

graper

高级会员

45

主题

63

帖子

1348

积分

高级会员

积分
1348

活字格认证

graper
高级会员   /  发表于:2009-12-11 15:12  /   查看:6346  /  回复:0
Post by "KevinShan", 01-15-2007, 23:47
-----------------------------------------------------


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


最近由于工作需要,研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.
下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.
以下的两幅图片显示了最终的样子.



Run-Time下的样子 1



Design-Time下的样子 1


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

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

, 我们可以直接将继承自Control类的第三方控件作为ToolStripControlHost的构造函数的参数构造一个ToolStripControlHost实例, 将这个实例直接作为ToolStripItem加到ToolStripItems集合中使用即可.
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);

  }

}


完整的示例请参见MSDN(http://msdn2.microsoft.com/en-us/library/9k5etstz.aspx ).


如何提供设计时的支持

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


-完-

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0 个回复

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