如何:使用 ToolStripControlHost 包装 Windows 窗体控件

设计 ToolStripControlHost 旨在通过使用 ToolStripControlHost 构造函数或通过扩展 ToolStripControlHost 本身来承载任意 Windows 窗体控件。 通过扩展 ToolStripControlHost 和实现属性和方法,以公开控件的常用属性和方法,使包装控件变得更容易。 也可以在 ToolStripControlHost 级公开控件的事件。

通过派生在 ToolStripControlHost 中承载控件

  1. 扩展 ToolStripControlHost。 实现一个调用传入所需控件的基类构造函数的默认构造函数。

    ' Call the base constructor passing in a MonthCalendar instance.
    Public Sub New() 
        MyBase.New(New MonthCalendar())
    
    End Sub
    
            // Call the base constructor passing in a MonthCalendar instance.
            public ToolStripMonthCalendar() : base (new MonthCalendar()) { }
    
    // Call the base constructor passing in a MonthCalendar instance.
    ToolStripMonthCalendar() : ToolStripControlHost( gcnew MonthCalendar ) {}
    
  2. 声明一个与包装控件相同类型的属性,并在属性访问器中返回 Control 作为正确类型的控件。

    Public ReadOnly Property MonthCalendarControl() As MonthCalendar 
        Get
            Return CType(Control, MonthCalendar)
        End Get
    End Property
    
            public MonthCalendar MonthCalendarControl
            {
                get
                {
                    return Control as MonthCalendar;
                }
            }
    
    property MonthCalendar^ MonthCalendarControl 
    {
       MonthCalendar^ get()
       {
          return static_cast<MonthCalendar^>(Control);
       }
    }
    
  3. 使用扩展类中的属性和方法公开包装控件的其他常用属性和方法。

    ' Expose the MonthCalendar.FirstDayOfWeek as a property.
    Public Property FirstDayOfWeek() As Day 
        Get
            Return MonthCalendarControl.FirstDayOfWeek
        End Get
        Set
            MonthCalendarControl.FirstDayOfWeek = value
        End Set
    End Property
    
    ' Expose the AddBoldedDate method.
    Public Sub AddBoldedDate(ByVal dateToBold As DateTime) 
        MonthCalendarControl.AddBoldedDate(dateToBold)
    
    End Sub
    
            // Expose the MonthCalendar.FirstDayOfWeek as a property.
            public Day FirstDayOfWeek
            {
                get
                {
                    return MonthCalendarControl.FirstDayOfWeek;
                }
                set { MonthCalendarControl.FirstDayOfWeek = value; }
            }
    
            // Expose the AddBoldedDate method.
            public void AddBoldedDate(DateTime dateToBold)
            {
                MonthCalendarControl.AddBoldedDate(dateToBold);
            }
    
    property Day FirstDayOfWeek 
    {
       // Expose the MonthCalendar.FirstDayOfWeek as a property.
       Day get()
       {
          return MonthCalendarControl->FirstDayOfWeek;
       }
    
       void set( Day value )
       {
          MonthCalendarControl->FirstDayOfWeek = value;
       }
    }
    
    // Expose the AddBoldedDate method.
    void AddBoldedDate( DateTime dateToBold )
    {
       MonthCalendarControl->AddBoldedDate( dateToBold );
    }
    
  4. 也可以选择重写 OnSubscribeControlEventsOnUnsubscribeControlEvents 方法,并添加要公开的控件事件。

    Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control) 
    
        ' Call the base so the base events are connected.
        MyBase.OnSubscribeControlEvents(c)
    
        ' Cast the control to a MonthCalendar control.
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)
    
        ' Add the event.
        AddHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged
    
    End Sub
    
    Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)
        ' Call the base method so the basic events are unsubscribed.
        MyBase.OnUnsubscribeControlEvents(c)
    
        ' Cast the control to a MonthCalendar control.
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)
    
        ' Remove the event.
        RemoveHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged
    
    End Sub
    
            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);
            }
    
    void OnSubscribeControlEvents( System::Windows::Forms::Control^ c )
    {
       // Call the base so the base events are connected.
       __super::OnSubscribeControlEvents( c );
    
       // Cast the control to a MonthCalendar control.
       MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;
    
       // Add the event.
       monthCalendarControl->DateChanged += gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
    }
    
    void OnUnsubscribeControlEvents( System::Windows::Forms::Control^ c )
    {
    
       // Call the base method so the basic events are unsubscribed.
       __super::OnUnsubscribeControlEvents( c );
    
       // Cast the control to a MonthCalendar control.
       MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;
    
       // Remove the event.
       monthCalendarControl->DateChanged -= gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
    }
    
  5. 为要公开的事件提供必要的包装。

        ' Declare the DateChanged event.
        Public Event DateChanged As DateRangeEventHandler
    
        ' Raise the DateChanged event.
        Private Sub HandleDateChanged(ByVal sender As Object, _
            ByVal e As DateRangeEventArgs)
    
            RaiseEvent DateChanged(Me, e)
        End Sub
    End Class
    
            // 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);
                }
            }
    
    // Declare the DateChanged event.
    // Raise the DateChanged event.
    void HandleDateChanged( Object^ sender, DateRangeEventArgs^ e )
    {
       if ( DateChanged != nullptr )
       {
          DateChanged( this, e );
       }
    }
    

示例

'Declare a class that inherits from ToolStripControlHost.

Public Class ToolStripMonthCalendar
    Inherits ToolStripControlHost

    ' Call the base constructor passing in a MonthCalendar instance.
    Public Sub New() 
        MyBase.New(New MonthCalendar())

    End Sub

    Public ReadOnly Property MonthCalendarControl() As MonthCalendar 
        Get
            Return CType(Control, MonthCalendar)
        End Get
    End Property

    ' Expose the MonthCalendar.FirstDayOfWeek as a property.
    Public Property FirstDayOfWeek() As Day 
        Get
            Return MonthCalendarControl.FirstDayOfWeek
        End Get
        Set
            MonthCalendarControl.FirstDayOfWeek = value
        End Set
    End Property

    ' Expose the AddBoldedDate method.
    Public Sub AddBoldedDate(ByVal dateToBold As DateTime) 
        MonthCalendarControl.AddBoldedDate(dateToBold)

    End Sub

    ' Subscribe and unsubscribe the control events you wish to expose.
    Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control) 

        ' Call the base so the base events are connected.
        MyBase.OnSubscribeControlEvents(c)

        ' Cast the control to a MonthCalendar control.
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)

        ' Add the event.
        AddHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged

    End Sub

    Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)
        ' Call the base method so the basic events are unsubscribed.
        MyBase.OnUnsubscribeControlEvents(c)

        ' Cast the control to a MonthCalendar control.
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)

        ' Remove the event.
        RemoveHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged

    End Sub

    ' Declare the DateChanged event.
    Public Event DateChanged As DateRangeEventHandler

    ' Raise the DateChanged event.
    Private Sub HandleDateChanged(ByVal sender As Object, _
        ByVal e As DateRangeEventArgs)

        RaiseEvent DateChanged(Me, e)
    End Sub
End Class
    //Declare a class that inherits from ToolStripControlHost.
    public class ToolStripMonthCalendar : ToolStripControlHost
    {
        // Call the base constructor passing in a MonthCalendar instance.
        public ToolStripMonthCalendar() : base (new MonthCalendar()) { }

        public MonthCalendar MonthCalendarControl
        {
            get
            {
                return Control as MonthCalendar;
            }
        }

        // Expose the MonthCalendar.FirstDayOfWeek as a property.
        public Day FirstDayOfWeek
        {
            get
            {
                return MonthCalendarControl.FirstDayOfWeek;
            }
            set { MonthCalendarControl.FirstDayOfWeek = value; }
        }

        // Expose the AddBoldedDate method.
        public void AddBoldedDate(DateTime dateToBold)
        {
            MonthCalendarControl.AddBoldedDate(dateToBold);
        }

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

        // 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);
            }
        }
    }
//Declare a class that inherits from ToolStripControlHost.
public ref class ToolStripMonthCalendar: public ToolStripControlHost
{
public:
   // Call the base constructor passing in a MonthCalendar instance.
   ToolStripMonthCalendar() : ToolStripControlHost( gcnew MonthCalendar ) {}

   property MonthCalendar^ MonthCalendarControl 
   {
      MonthCalendar^ get()
      {
         return static_cast<MonthCalendar^>(Control);
      }
   }
   property Day FirstDayOfWeek 
   {
      // Expose the MonthCalendar.FirstDayOfWeek as a property.
      Day get()
      {
         return MonthCalendarControl->FirstDayOfWeek;
      }

      void set( Day value )
      {
         MonthCalendarControl->FirstDayOfWeek = value;
      }
   }

   // Expose the AddBoldedDate method.
   void AddBoldedDate( DateTime dateToBold )
   {
      MonthCalendarControl->AddBoldedDate( dateToBold );
   }

protected:
   // Subscribe and unsubscribe the control events you wish to expose.
   void OnSubscribeControlEvents( System::Windows::Forms::Control^ c )
   {
      // Call the base so the base events are connected.
      __super::OnSubscribeControlEvents( c );

      // Cast the control to a MonthCalendar control.
      MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;

      // Add the event.
      monthCalendarControl->DateChanged += gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
   }

   void OnUnsubscribeControlEvents( System::Windows::Forms::Control^ c )
   {

      // Call the base method so the basic events are unsubscribed.
      __super::OnUnsubscribeControlEvents( c );

      // Cast the control to a MonthCalendar control.
      MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;

      // Remove the event.
      monthCalendarControl->DateChanged -= gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
   }

public:
   event DateRangeEventHandler^ DateChanged;

private:
   // Declare the DateChanged event.
   // Raise the DateChanged event.
   void HandleDateChanged( Object^ sender, DateRangeEventArgs^ e )
   {
      if ( DateChanged != nullptr )
      {
         DateChanged( this, e );
      }
   }
};

编译代码

  • 此示例需要:

  • 对 System 和 System.Windows.Forms 程序集的引用。

有关从 Visual Basic 或 Visual C# 的命令行生成此示例的信息,请参见从命令行生成 (Visual Basic)在命令行上使用 csc.exe 生成。 也可以通过将代码粘贴到新项目,在 Visual Studio 中生成此示例。 有关更多信息,请参见 如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例如何:使用 Visual Studio 编译和运行完整的 Windows 窗体代码示例.

请参见

参考

ToolStripControlHost

ToolStrip 控件概述(Windows 窗体)

概念

ToolStrip 控件体系结构

ToolStrip 技术摘要