专栏首页葡萄城控件技术团队如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持

如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持

最近研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持.

下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中.

以下的两幅图片显示了最终的样子.

Run-Time下的样子

Design-Time下的样子

如何将第三方控件嵌入到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
{
       //TODO: ......
}

The End

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ComponentOne.NET仪表板布局控件 — 实现可视化数据大屏展示

    .NET开发领域的总体趋势是互操作性,葡萄城全功能 .NET控件集 ComponentOne 在2018将延续这一趋势:无论是 .NET平台,ASP.NET C...

    葡萄城控件
  • .NET控件集ComponentOne 2018V3发布:新增图表动画及迷你图

    “通过使用 ComponentOne .NET控件产品,实现了兼具 BS 架构灵活性与 CS 架构的客户体验。丰富的控件满足了项目中的各种特殊需求,使得开发的精...

    葡萄城控件
  • 专注智慧交通,丰田使用 ComponentOne 打造智能交通系统

    近日,丰田汽车(中国)投资有限公司(简称:TMCI)成功签约葡萄城,专注智慧交通,用 ComponentOne .NET控件集打造新一代智能交通系统,保障行车安...

    葡萄城控件
  • Asp.net页面生命周期

    前言                                      本篇记录的是Asp.net页面生命周期,也就是管道模型的最末端HttpHandl...

    ^_^肥仔John
  • React Native的props

    Oceanlong
  • 网页优化系列三:使用压缩后置viewstate

      Asp.net中的服务器控件都启用了viewstate,虽然方便了开发人员,但页面大小及性能上确实有所影响,对于无需viewstate的控件及页面可以直接把...

    ^_^肥仔John
  • 网页优化系列三:使用压缩后置viewstate

      Asp.net中的服务器控件都启用了viewstate,虽然方便了开发人员,但页面大小及性能上确实有所影响,对于无需viewstate的控件及页面可以直接把...

    ^_^肥仔John
  • nodejs微信支付之扫码支付

    本篇文章主要是记录本人在微信扫码支付过程中所遇到的问题,给大家一个借鉴作用,希望对你们有帮助

    前端博客 : alili.tech
  • Pytorch的API总览

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    于小勇
  • SAP C4C里如何创建两个具有依赖关系的下拉菜单

    I am asked by colleague about how to develop two drop down list with dependency ...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券