最近研究了一下如何将第三方控件嵌入到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