ToolStrip 系統僅內建 ToolStripButton、ToolStripLabel、ToolStripTextBox 等有限項目。若要嵌入 MonthCalendar、Chart 等任意控件,需借助 ToolStripControlHost。本文以 MonthCalendar 為例,完整演示從嵌入到設計時支援的全流程。
private void Form_Load(object sender, EventArgs e) {
var cal = new MonthCalendar { FirstDayOfWeek = Day.Monday };
toolStrip1.Items.Add(new ToolStripControlHost(cal));
}
建立 ToolStripMonthCalendar : ToolStripControlHost,五步完成:
public ToolStripMonthCalendar() : base(new MonthCalendar()) { }
public MonthCalendar MonthCalendarControl => base.Control as MonthCalendar;
public Day FirstDayOfWeek {
get => MonthCalendarControl.FirstDayOfWeek;
set => MonthCalendarControl.FirstDayOfWeek = value;
}
public void AddBoldedDate(DateTime date) => MonthCalendarControl.AddBoldedDate(date);
protected override void OnSubscribeControlEvents(Control c) {
base.OnSubscribeControlEvents(c);
var mc = (MonthCalendar)c;
mc.DateChanged += OnDateChanged;
}
protected override void OnUnsubscribeControlEvents(Control c) {
base.OnUnsubscribeControlEvents(c);
var mc = (MonthCalendar)c;
mc.DateChanged -= OnDateChanged;
}
public event DateRangeEventHandler DateChanged;
private void OnDateChanged(object sender, DateRangeEventArgs e)
=> DateChanged?.Invoke(this, e);
ToolStripItemDesignerAvailabilityAttribute指定可見容器類型(位元組合):
[ToolStripItemDesignerAvailability(
ToolStripItemDesignerAvailability.ToolStrip |
ToolStripItemDesignerAvailability.MenuStrip |
ToolStripItemDesignerAvailability.ContextMenuStrip |
ToolStripItemDesignerAvailability.StatusStrip)]
加上此屬性,衍生控件即出現在四類容器的設計時下拉清單中。
ToolboxBitmapAttribute 設定工具箱圖示
[ToolboxBitmap(typeof(MonthCalendar))]
[DefaultProperty("Value")]
public class ToolStripMonthCalendar : ToolStripControlHost { ... }
工具箱將顯示 MonthCalendar 原生圖示,辨識度極高。
[ToolboxBitmap(typeof(MonthCalendar))]
[DefaultProperty("Value")]
[ToolStripItemDesignerAvailability(
ToolStripItemDesignerAvailability.ContextMenuStrip |
ToolStripItemDesignerAvailability.MenuStrip |
ToolStripItemDesignerAvailability.StatusStrip |
ToolStripItemDesignerAvailability.ToolStrip)]
public class ToolStripMonthCalendar : ToolStripControlHost
{
public ToolStripMonthCalendar() : base(new MonthCalendar()) { }
public MonthCalendar MonthCalendarControl => base.Control as MonthCalendar;
public Day FirstDayOfWeek {
get => MonthCalendarControl.FirstDayOfWeek;
set => MonthCalendarControl.FirstDayOfWeek = value;
}
public void AddBoldedDate(DateTime date) => MonthCalendarControl.AddBoldedDate(date);
public event DateRangeEventHandler DateChanged;
protected override void OnSubscribeControlEvents(Control c) {
base.OnSubscribeControlEvents(c);
((MonthCalendar)c).DateChanged += OnDateChanged;
}
protected override void OnUnsubscribeControlEvents(Control c) {
base.OnUnsubscribeControlEvents(c);
((MonthCalendar)c).DateChanged -= OnDateChanged;
}
private void OnDateChanged(object sender, DateRangeEventArgs e)
=> DateChanged?.Invoke(this, e);
}
同一套代碼,零修改即可嵌入上述三種條狀容器,複用率 100%。
MSDN 官方完整範例:ToolStripControlHost Class