首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

將第三方控件嵌入 ToolStrip 並實現設計時支援:完整實戰教程

     編輯:關於.NET

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,五步完成:

1. 建構函式傳遞控件實例

public ToolStripMonthCalendar() : base(new MonthCalendar()) { }

2. 暴露強型別控件屬性

public MonthCalendar MonthCalendarControl => base.Control as MonthCalendar;

3. 代理常用屬性/方法

public Day FirstDayOfWeek {
    get => MonthCalendarControl.FirstDayOfWeek;
    set => MonthCalendarControl.FirstDayOfWeek = value;
}

public void AddBoldedDate(DateTime date) => MonthCalendarControl.AddBoldedDate(date);

4. 訂閱/取消訂閱事件


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;
}

5. 包裝事件對外暴露


public event DateRangeEventHandler DateChanged;
private void OnDateChanged(object sender, DateRangeEventArgs e) 
    => DateChanged?.Invoke(this, e);

設計時支援:讓工具箱識別、屬性網格編輯

1. ToolStripItemDesignerAvailabilityAttribute

指定可見容器類型(位元組合):


[ToolStripItemDesignerAvailability(
    ToolStripItemDesignerAvailability.ToolStrip |
    ToolStripItemDesignerAvailability.MenuStrip |
    ToolStripItemDesignerAvailability.ContextMenuStrip |
    ToolStripItemDesignerAvailability.StatusStrip)]

加上此屬性,衍生控件即出現在四類容器的設計時下拉清單中。

2. 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);
}

延伸:同樣適用於 ContextMenuStrip、MenuStrip、StatusStrip

同一套代碼,零修改即可嵌入上述三種條狀容器,複用率 100%。

參考資源

MSDN 官方完整範例:ToolStripControlHost Class

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved