如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持
最近研究了一下如何將第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.
下面將詳細講解如何把系統的MonthCalendar控件嵌入到ToolStrip控件中.
以下的兩幅圖片顯示了最終的樣子.
Run-Time下的樣子
Design-Time下的樣子
如何將第三方控件嵌入到ToolStrip(http://www.freeeim.com/bbs/)
微軟實現了一個ToolStripControlHost類, 它是ToolStripComboBox, ToolStripTextBox, 和 ToolStripProgressBar等的基類. ToolStripControlHost提供了將第三方控件嵌入ToolStrip的能力. 我們可以用兩種方式使用它:
一, 我們可以直接將繼承自Control類的第三方控件作為ToolStripControlHost的構造函數的參數構造一個ToolStripControlHost實例, 將這個實例直接作為ToolStrip的Item加到ToolStrip的Items集合中使用即可.FreeEIM 每日健康多一點!
view sourceprint?1 private void Form2_Load(object sender, EventArgs e)?
2 {?
3???? MonthCalendar monthCalendar = new MonthCalendar();?
4???? monthCalendar.FirstDayOfWeek = Day.Monday;?
5???? this.toolStrip1.Items.Add(new ToolStripControlHost(monthCalendar));?
6 }
?
二, 從ToolStripControlHost派生, 在繼承類默認參構造函數中將第三方控件作為參數調用基類的有參構造函數. 這種方式可以很容易的在繼承類中暴露屬性,方法和事件,便于訪問.
實現步驟如下:
1, 擴展 ToolStripControlHost。實現一個調用傳入所需控件的基類構造函數的默認構造函數。
?
view sourceprint?1 public ToolStripMonthCalendar() : base(new MonthCalendar())?
2 {?
3???
4 }
?
2, 聲明一個與包裝控件相同類型的屬性,并在屬性訪問器中返回 Control 作為正確類型的控件。
?
?
view sourceprint?1 public MonthCalendar MonthCalendarControl?
2 {?
3???? get
4???? {?
5???????? return base.Control as MonthCalendar;?
6???? }?
7 }
?
3, 使用擴展類中的屬性和方法公開包裝控件的其他常用屬性和方法。
view sourceprint?01 // Expose the MonthCalendar.FirstDayOfWeek as a property.?
02 public Day FirstDayOfWeek?
03 {?
04???? get
05???? {?
06????????? return this.MonthCalendarControl.FirstDayOfWeek;?
07???? }?
08???? set
09???? {?
10???????? value = this.MonthCalendarControl.FirstDayOfWeek;?
11???? }?
12 }?
13????
14???
15 // Expose the AddBoldedDate method.?
16 public void AddBoldedDate(DateTime dateToBold)?
17 {?
18????? this.MonthCalendarControl.AddBoldedDate(dateToBold);?
19 }
?
4, 也可以選擇重寫 OnSubscribeControlEvents 和 OnUnsubscribeControlEvents 方法,并添加要公開的控件事件。
view sourceprint?01 // Subscribe and unsubscribe the control events you wish to expose.?
02 protected override void OnSubscribeControlEvents(Control c)?
03 {?
04???? // Call the base so the base events are connected.?
05???? base.OnSubscribeControlEvents(c);?
06???
07???? // Cast the control to a MonthCalendar control.?
08???? MonthCalendar monthCalendarControl = (MonthCalendar)c;?
09???
10???? // Add the event.?
11???? monthCalendarControl.DateChanged += new DateRangeEventHandler(OnDateChanged);?
12 }?
13???
14 protected override void OnUnsubscribeControlEvents(Control c)?
15 {?
16???? // Call the base method so the basic events are unsubscribed.?
17???? base.OnUnsubscribeControlEvents(c);?
18????
19???
20???? // Cast the control to a MonthCalendar control.?
21???? MonthCalendar monthCalendarControl = (MonthCalendar)c;?
22???
23???
24???? // Remove the event.?
25???? monthCalendarControl.DateChanged -= new DateRangeEventHandler(OnDateChanged);?
26 }
?
5, 為要公開的事件提供必要的包裝。
view sourceprint?01 // Declare the DateChanged event.?
02???
03 public event DateRangeEventHandler DateChanged;?
04???????????
05???
06 // Raise the DateChanged event.?
07???
08? private void OnDateChanged(object sender, DateRangeEventArgs e)?
09 {?
10???? if (DateChanged != null)?
11???? {?
12???????? DateChanged(this, e);?
13???? }?
14 }
?
完整的示例請參見MSDN(http://freeeim.blog.sohu.com/).
?
如何提供設計時的支持
?
1, 為從ToolStripControlHost繼承的類添加ToolStripItemDesignerAvailabilityAttribute標簽.
?
它可以使ToolStrip在Design-Time下能夠找到從ToolStripControlHost繼承的第三方控件, 直接效果就是第三方控件在下拉菜單中可以直接列舉出來. 另外,除了可以將第三方控件嵌入ToolStrip外, 我們還可以直接將第三方控件嵌入到ContextMenuStrip, MenuStrip和StatusStrip中.
ToolStripItemDesignerAvailability枚舉成員如下:
成員名稱
?說明
?
All
?指定所有控件均可見。
ContextMenuStrip
?指定 ContextMenuStrip 是可見的。
MenuStrip
?指定 MenuStrip 是可見的。
?
None
?指定無任何控件可見。
StatusStrip
?指定 StatusStrip 是可見的。
ToolStrip
?指定 ToolStrip 是可見的。
?
2, 為繼承的控件添加ToolboxBitmapAttribute標簽改變默認Icon.
?
view sourceprint?01 [ToolboxBitmap(typeof(MonthCalendar))]?
02 [DefaultProperty("Value")]??
03 [ToolStripItemDesignerAvailability(?
04???? ToolStripItemDesignerAvailability.ContextMenuStrip |?
05???? ToolStripItemDesignerAvailability.MenuStrip |?
06???? ToolStripItemDesignerAvailability.StatusStrip |?
07???? ToolStripItemDesignerAvailability.ToolStrip)]?
08 public class ToolStripMonthCalendar : ToolStripControlHost?
09 {?
10??????? //TODO: ......?
11 }
?
The End
總結
以上是生活随笔為你收集整理的如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 模拟事件触发
- 下一篇: 简单的鼠标移动窗体