zoukankan      html  css  js  c++  java
  • 如何将第三方控件嵌入ToolStrip控件,并提供DesignTime支持

    最近研究了一下如何将第三方控件嵌入到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



    本文是由葡萄城技术开发团队发布,转载请注明出处:葡萄城官网


  • 相关阅读:
    7人脸识别
    1图片视频文件操作基础
    3直方图与二值化,图像梯度
    6模板匹配(人脸匹配案例)
    基础习题
    碎片知识点整理
    详解:MySQL数据表损坏的正确修复方案
    前端开发:模块化 — 高效重构
    分享几个基于jQuery不错的前端相册展示插件代码
    程序员编程10年的心得和体会
  • 原文地址:https://www.cnblogs.com/powertoolsteam/p/1780832.html
Copyright © 2011-2022 走看看