Gewusst wie: Verwenden eines ToolStripControlHost als Wrapper für ein Windows Forms-Steuerelement

Der ToolStripControlHost wurde dafür entwickelt, das Hosten von beliebigen Windows Forms-Steuerelementen durch Verwendung des ToolStripControlHost-Konstruktors oder Erweiterung des ToolStripControlHost selbst zu ermöglichen. Es ist einfacher, das Steuerelement zu umschließen, indem der ToolStripControlHost erweitert wird und die Eigenschaften und Methoden implementiert werden, die häufig verwendete Eigenschaften und Methoden des Steuerelements verfügbar machen. Sie können auch Ereignisse für das Steuerelement auf der ToolStripControlHost-Ebene verfügbar machen.

So hosten Sie ein Steuerelement in einem ToolStripControlHost durch Ableiten

  1. Erweitern Sie den ToolStripControlHost. Implementieren Sie einen Standardkonstruktor, der den Basisklassenkonstruktor aufruft, der das gewünschte Steuerelement übergibt.

    ' 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. Deklarieren Sie eine Eigenschaft desselben Typs wie dem des umschlossenen Steuerelements, und geben Sie Control als richtigen Typ des Steuerelements im Accessor der Eigenschaft zurück.

    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. Machen Sie andere häufig verwendete Eigenschaften und Methoden des umschlossenen Steuerelements mit Eigenschaften und Methoden in der erweiterten Klasse verfügbar.

    ' 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. Überschreiben Sie optional die OnSubscribeControlEvents-Methode und die OnUnsubscribeControlEvents-Methode, und fügen Sie die Steuerelementereignisse hinzu, die Sie verfügbar machen möchten.

    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. Stellen Sie die notwendigen Wrapper für die Ereignisse bereit, die Sie verfügbar machen möchten.

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

Beispiel

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

Kompilieren des Codes

  • Für dieses Beispiel sind erforderlich:

  • Verweise auf die Assemblys System und System.Windows.Forms.

Informationen zum Erstellen dieses Beispiels über die Befehlszeile für Visual Basic oder Visual C# finden Sie unter Erstellen von der Befehlszeile aus (Visual Basic) oder unter Erstellen über die Befehlszeile mit csc.exe. Sie können dieses Beispiel auch in Visual Studio erstellen, indem Sie den Code in ein neues Projekt einfügen. Weitere Informationen finden Sie unter Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio und Gewusst wie: Kompilieren und Ausführen eines vollständigen Windows Forms-Codebeispiels mit Visual Studio.

Siehe auch

Referenz

ToolStripControlHost

Übersicht über das ToolStrip-Steuerelement (Windows Forms)

Konzepte

Architektur des ToolStrip-Steuerelements

Zusammenfassung der ToolStrip-Technologie