Estendere un controllo esistente

Se si desidera aggiungere altre funzionalità a un controllo esistente, è possibile creare un controllo che eredita da un controllo esistente. Il nuovo controllo contiene tutte le funzionalità e l'aspetto visivo del controllo di base, ma offre la possibilità di estenderlo. Ad esempio, se è stato creato un controllo che eredita Button, il nuovo controllo sarà simile a un pulsante. È possibile creare nuovi metodi e proprietà per personalizzare il comportamento del controllo. Alcuni controlli consentono di eseguire l'override del OnPaint metodo per modificare l'aspetto del controllo.

Aggiungere un controllo personalizzato a un progetto

Dopo aver creato un nuovo progetto, usare i modelli di Visual Studio per creare un controllo utente. I passaggi seguenti illustrano come aggiungere un controllo utente al progetto:

  1. In Visual Studio trovare il riquadro Esplora progetti . Fare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi>classe.

    Fare clic con il pulsante destro del mouse su Esplora soluzioni di Visual Studio per aggiungere un controllo utente a un progetto di Windows Form

  2. Nella casella Nome digitare un nome per il controllo utente. Visual Studio fornisce un nome predefinito e univoco che è possibile usare. Premere quindi Aggiungi.

    Finestra di dialogo Aggiungi elemento in Visual Studio per Windows Form

Dopo aver creato il controllo utente, Visual Studio apre l'editor di codice per il controllo . Il passaggio successivo consiste nel trasformare questo controllo personalizzato in un pulsante ed estenderlo.

Modificare il controllo personalizzato in un pulsante

In questa sezione si apprenderà come modificare un controllo personalizzato in un pulsante che conta e visualizza il numero di volte in cui viene fatto clic.

Un Windows Form per il controllo personalizzato .NET

Dopo aver aggiunto un controllo personalizzato al progetto denominato CustomControl1, la finestra di progettazione dei controlli deve essere aperta. In caso contrario, fare doppio clic sul controllo nel Esplora soluzioni. Seguire questa procedura per convertire il controllo personalizzato in un controllo che eredita da Button e lo estende:

  1. Dopo aver aperto la finestra di progettazione dei controlli, premere F7 o fare clic con il pulsante destro del mouse sulla finestra di progettazione e selezionare Visualizza codice.

  2. Nell'editor di codice dovrebbe essere visualizzata una definizione di classe:

    namespace CustomControlProject
    {
        public partial class CustomControl2 : Control
        {
            public CustomControl2()
            {
                InitializeComponent();
            }
    
            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
            }
        }
    }
    
    Public Class CustomControl2
    
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
    
            'Add your custom paint code here
        End Sub
    
    End Class
    
  3. Modificare la classe base da Control a Button.

    Importante

    Se si usa Visual Basic, la classe di base viene definita nel file *.designer.vb del controllo. La classe base da usare in Visual Basic è System.Windows.Forms.Button.

  4. Aggiungere una variabile con ambito classe denominata _counter.

    private int _counter = 0;
    
    Private _counter As Integer = 0
    
  5. Eseguire l'override del metodo OnPaint. Questo metodo disegna il controllo . Il controllo deve disegnare una stringa sopra il pulsante, quindi è necessario chiamare prima il metodo della OnPaint classe di base, quindi disegnare una stringa.

    protected override void OnPaint(PaintEventArgs pe)
    {
        // Draw the control
        base.OnPaint(pe);
    
        // Paint our string on top of it
        pe.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, new PointF(3, 3));
    }
    
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    
        ' Draw the control
        MyBase.OnPaint(e)
    
        ' Paint our string on top of it
        e.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, New PointF(3, 3))
    
    End Sub
    
  6. Infine, eseguire l'override del OnClick metodo . Questo metodo viene chiamato ogni volta che viene premuto il controllo. Il codice aumenterà il contatore e quindi chiamerà il Invalidate metodo , che forza il controllo a ridisegnarsi.

    protected override void OnClick(EventArgs e)
    {
        // Increase the counter and redraw the control
        _counter++;
        Invalidate();
    
        // Call the base method to invoke the Click event
        base.OnClick(e);
    }
    
    Protected Overrides Sub OnClick(e As EventArgs)
    
        ' Increase the counter and redraw the control
        _counter += 1
        Invalidate()
    
        ' Call the base method to invoke the Click event
        MyBase.OnClick(e)
    
    End Sub
    

    Il codice finale dovrebbe essere simile al frammento di codice seguente:

    public partial class CustomControl1 : Button
    {
        private int _counter = 0;
    
        public CustomControl1()
        {
            InitializeComponent();
        }
    
        protected override void OnPaint(PaintEventArgs pe)
        {
            // Draw the control
            base.OnPaint(pe);
    
            // Paint our string on top of it
            pe.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, new PointF(3, 3));
        }
    
        protected override void OnClick(EventArgs e)
        {
            // Increase the counter and redraw the control
            _counter++;
            Invalidate();
    
            // Call the base method to invoke the Click event
            base.OnClick(e);
        }
    }
    
    Public Class CustomControl1
    
        Private _counter As Integer = 0
    
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    
            ' Draw the control
            MyBase.OnPaint(e)
    
            ' Paint our string on top of it
            e.Graphics.DrawString($"Clicked {_counter} times", Font, Brushes.Purple, New PointF(3, 3))
    
        End Sub
    
        Protected Overrides Sub OnClick(e As EventArgs)
    
            ' Increase the counter and redraw the control
            _counter += 1
            Invalidate()
    
            ' Call the base method to invoke the Click event
            MyBase.OnClick(e)
    
        End Sub
    
    End Class
    

Dopo aver creato il controllo, compilare il progetto per popolare la finestra casella degli strumenti con il nuovo controllo . Aprire una finestra di progettazione moduli e trascinare il controllo nel form. Eseguire il progetto e premere il pulsante. Ogni pressione aumenta il numero di clic di uno. I clic totali vengono stampati come testo nella parte superiore del pulsante.

Finestra casella degli strumenti di Visual Studio per Windows Form che mostra un controllo personalizzato.