最近研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.
下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.
以下的两幅图片显示了最终的样子.
Run-Time下的样子
Design-Time下的样子
微软实现了一个ToolStripControlHost类, 它是ToolStripComboBox, ToolStripTextBox, 和 ToolStripProgressBar等的基类. ToolStripControlHost提供了将第三方控件嵌入ToolStrip的能力. 我们可以用两种方式使用它:
private void Form2_Load(object sender, EventArgs e)
{
MonthCalendar monthCalendar = new MonthCalendar();
monthCalendar.FirstDayOfWeek = Day.Monday;
this.toolStrip1.Items.Add(new ToolStripControlHost(monthCalendar));
}
实现步骤如下:
public ToolStripMonthCalendar() : base(new MonthCalendar())
{
}
public MonthCalendar MonthCalendarControl
{
get
{
return base.Control as MonthCalendar;
}
}
// 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);
}
// 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);
}
// 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 ).
它可以使ToolStrip在Design-Time下能够找到从ToolStripControlHost继承的第三方控件, 直接效果就是第三方控件在下拉菜单中可以直接列举出来. 另外,除了可以将第三方控件嵌入ToolStrip外, 我们还可以直接将第三方控件嵌入到ContextMenuStrip, MenuStrip和StatusStrip中.
ToolStripItemDesignerAvailability枚举成员如下:
成员名称 | 说明 |
---|---|
All | 指定所有控件均可见。 |
ContextMenuStrip | 指定 ContextMenuStrip 是可见的。 |
MenuStrip | 指定 MenuStrip 是可见的。 |
None | 指定无任何控件可见。 |
StatusStrip | 指定 StatusStrip 是可见的。 |
ToolStrip | 指定 ToolStrip 是可见的。 |
[ToolboxBitmap(typeof(MonthCalendar))]
[DefaultProperty("Value")]
[ToolStripItemDesignerAvailability(
ToolStripItemDesignerAvailability.ContextMenuStrip |
ToolStripItemDesignerAvailability.MenuStrip |
ToolStripItemDesignerAvailability.StatusStrip |
ToolStripItemDesignerAvailability.ToolStrip)]
public class ToolStripMonthCalendar : ToolStripControlHost
{
//TODO: ......
}
The End