如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持
2007-10-23 09:19
459 查看
本文引用自http://blog.joycode.com/grapecity/archive/2007/04/23/101634.aspx
最近由于工作需要,研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.
下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.
以下的两幅图片显示了最终的样子.
Run-Time下的样子 1
Design-Time下的样子 1
如何将第三方控件嵌入到ToolStrip
微软实现了一个ToolStripControlHost类, 它是ToolStripComboBox, ToolStripTextBox, 和 ToolStripProgressBar等的基类. ToolStripControlHost提供了将第三方控件嵌入ToolStrip的能力. 我们可以用两种方式使用它:
一, 我们可以直接将继承自Control类的第三方控件作为ToolStripControlHost的构造函数的参数构造一个ToolStripControlHost实例, 将这个实例直接作为ToolStrip的Item加到ToolStrip的Items集合中使用即可.
二, 从ToolStripControlHost派生, 在继承类默认参构造函数中将第三方控件作为参数调用基类的有参构造函数. 这种方式可以很容易的在继承类中暴露属性,方法和事件,便于访问.
实现步骤如下:
1, 扩展 ToolStripControlHost。实现一个调用传入所需控件的基类构造函数的默认构造函数。
2, 声明一个与包装控件相同类型的属性,并在属性访问器中返回 Control 作为正确类型的控件。
3, 使用扩展类中的属性和方法公开包装控件的其他常用属性和方法。
4, 也可以选择重写 OnSubscribeControlEvents 和 OnUnsubscribeControlEvents 方法,并添加要公开的控件事件。
5, 为要公开的事件提供必要的包装。
完整的示例请参见MSDN(http://msdn2.microsoft.com/en-us/library/9k5etstz.aspx ).
如何提供设计时的支持
1, 为从ToolStripControlHost继承的类添加ToolStripItemDesignerAvailabilityAttribute标签. 它可以使ToolStrip在Design-Time下能够找到从ToolStripControlHost继承的第三方控件, 直接效果就是第三方控件在下拉菜单中可以直接列举出来. 另外,除了可以将第三方控件嵌入ToolStrip外, 我们还可以直接将第三方控件嵌入到ContextMenuStrip, MenuStrip和StatusStrip中.
ToolStripItemDesignerAvailability枚举成员如下:
2, 为继承的控件添加ToolboxBitmapAttribute标签改变默认Icon.
Demo is Here
最近由于工作需要,研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.
下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.
以下的两幅图片显示了最终的样子.
Run-Time下的样子 1
Design-Time下的样子 1
如何将第三方控件嵌入到ToolStrip
微软实现了一个ToolStripControlHost类, 它是ToolStripComboBox, ToolStripTextBox, 和 ToolStripProgressBar等的基类. ToolStripControlHost提供了将第三方控件嵌入ToolStrip的能力. 我们可以用两种方式使用它:
一, 我们可以直接将继承自Control类的第三方控件作为ToolStripControlHost的构造函数的参数构造一个ToolStripControlHost实例, 将这个实例直接作为ToolStrip的Item加到ToolStrip的Items集合中使用即可.
private void Form2_Load(object sender, EventArgs e) { MonthCalendar monthCalendar = new MonthCalendar(); monthCalendar.FirstDayOfWeek = Day.Monday; this.toolStrip1.Items.Add(new ToolStripControlHost(monthCalendar)); } |
二, 从ToolStripControlHost派生, 在继承类默认参构造函数中将第三方控件作为参数调用基类的有参构造函数. 这种方式可以很容易的在继承类中暴露属性,方法和事件,便于访问.
实现步骤如下:
1, 扩展 ToolStripControlHost。实现一个调用传入所需控件的基类构造函数的默认构造函数。
public ToolStripMonthCalendar() : base(new MonthCalendar()) { } |
2, 声明一个与包装控件相同类型的属性,并在属性访问器中返回 Control 作为正确类型的控件。
public MonthCalendar MonthCalendarControl { get { return base.Control as MonthCalendar; } } |
3, 使用扩展类中的属性和方法公开包装控件的其他常用属性和方法。
// 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); } |
4, 也可以选择重写 OnSubscribeControlEvents 和 OnUnsubscribeControlEvents 方法,并添加要公开的控件事件。
// 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); } |
5, 为要公开的事件提供必要的包装。
// 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 ).
如何提供设计时的支持
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.
[ToolboxBitmap(typeof(MonthCalendar))] [DefaultProperty("Value")] [ToolStripItemDesignerAvailability( ToolStripItemDesignerAvailability.ContextMenuStrip | ToolStripItemDesignerAvailability.MenuStrip | ToolStripItemDesignerAvailability.StatusStrip | ToolStripItemDesignerAvailability.ToolStrip)] public class ToolStripMonthCalendar : ToolStripControlHost { |
Demo is Here
相关文章推荐
- 如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持
- 如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持
- 如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持
- 如何在.NET中调试设计时(design-time)控件(上)
- 如何在.NET中调试设计时(design-time)控件(下)
- 如何在WPF中嵌入Skyline提供的三维控件
- 如何在.NET中调试设计时(design-time)控件(上)
- 如何在控件中嵌入脚本--经验谈
- WinForm 下的 Wizard(向导) 控件, 提供设计时支持!
- 绑定Enum到ASP.NET数据绑定控件的完美解决方案[05/26修订]——增加支持第三方枚举描述,支持二进制与过的枚举值
- 如何给别人提供支持库
- ActiveReports 报表应用教程 (13)---嵌入第三方控件
- Android Design Support Library 中控件的使用简单介绍(一)介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android
- 如何给第三方人员提供oracle接口
- [WinForm每日一帖] 如何使用UltraToolTipManager为控件提供带样式的ToolTip
- [转]如何在移动设备程序中嵌入盈利广告,开始挣钱了 android iphone ipad 多平台支持
- 如果不用QuickFlow提供的控件来开发工作流页面,如何启动流程,提交任务呢?
- [置顶] viewPager+photoView实现图片轮播和手势缩放功能 支持手势缩放的imageView 如何实现相册左右滑动和手势缩放 如何让图片自适应控件大小 photoView如何使用(上)
- Flex中如何通过设定headerStyleName样式在Accordion控件中使用嵌入字体的例子
- 总结:如何让下载的第三方网页执行本地脚本(利用CHtmlView系列控件)