Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra come creare un controllo Windows Form personalizzato. Il controllo semplice sviluppato in questo articolo stampa il controllo Text a sinistra, al centro o a destra del controllo. È possibile modificare l'allineamento del testo. Questo controllo non genera o gestisce eventi.
In questo articolo viene spiegato come:
- Aggiungere una proprietà e un campo per gestire l'impostazione di allineamento orizzontale del testo.
- Utilizzare
OnTextChanged
per invalidare il controllo. - Fornire codice nel metodo
OnPaint
per disegnare testo sulla superficie del controllo.
Aggiungere un controllo personalizzato
Il primo passaggio consiste nell'aggiungere un controllo personalizzato al progetto.
In Visual Studio trovare la finestra Esplora soluzioni . Fare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi>nuovo elemento.
Cercare Controllo personalizzato e selezionarlo.
Impostare il nome del file su FirstControl e selezionare Aggiungi.
Se la modalità progettazione del controllo è visibile, passare alla visualizzazione codice. Premere F7 o selezionare il collegamento passa alla visualizzazione codice .
Suggerimento
È anche possibile fare clic con il pulsante destro del mouse sul file nella finestra Esplora soluzioni e scegliere Visualizza codice.
A questo punto si dovrebbe esaminare il codice sorgente per il controllo personalizzato, simile al frammento di codice seguente:
public partial class FirstControl : Control
{
public FirstControl()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class FirstControl
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
Aggiungere una proprietà
Creare una nuova proprietà nel controllo denominato TextAlignment
. Questa proprietà regola la posizione in cui viene disegnato il testo nel controllo . Con la FirstControl
classe seguire questa procedura:
Aggiungere un campo denominato
_textAlignment
del tipoHorizontalAlignment
.private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
Avvolgere il campo in una proprietà denominata
TextAlignment
. Quando si imposta la proprietà, chiamare ilInvalidate
metodo per forzare il controllo a ridisegnarsi.public HorizontalAlignment TextAlignment { get => _textAlignment; set { _textAlignment = value; Invalidate(); } }
Public Property TextAlignment As HorizontalAlignment Get Return _textAlignment End Get Set(value As HorizontalAlignment) _textAlignment = value Invalidate() End Set End Property
Aggiungere gli attributi seguenti alla proprietà per integrarlo con la finestra Proprietà in Visual Studio.
Category
— Categoria applicata alla proprietà .Description
— Descrizione della proprietà.DefaultValue
: valore predefinito per la proprietà .Il valore predefinito consente di reimpostare la proprietà dalla finestra di progettazione. Consente inoltre di determinare quando la proprietà deve essere serializzata nel code-behind, perché i valori predefiniti non vengono serializzati.
[System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)] public HorizontalAlignment TextAlignment
<System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)> Public Property TextAlignment As HorizontalAlignment
Gestire il testo modificato
La TextAlignment
proprietà chiama Invalidate
in modo che il controllo ridisegni se stesso. In questo modo si garantisce che l'allineamento corretto venga usato immediatamente nel Text
del rendering del controllo. Tuttavia, se la Text
proprietà viene modificata, non viene aggiornato alcun elemento perché Text
non chiama Invalidate
. La proprietà, tuttavia, chiama il metodo OnTextChanged
, che è possibile sovrascrivere per chiamare Invalidate
e forzare il controllo a ridisegnarsi.
Con la FirstControl
classe seguire questa procedura:
- Sovrascrivere il metodo
OnTextChanged
. - Chiamare
base.OnTextChanged
affinché l'eventoTextChanged
venga generato come previsto dagli utenti del controllo. - Chiamare il metodo
Invalidate
per forzare il ridisegno.
Il codice dovrebbe essere simile al frammento di codice seguente:
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Disegnare il controllo
L'ultima parte del controllo personalizzato è disegnata. Con la FirstControl
classe seguire questa procedura:
Individuare il
OnPaint
metodo generato dal modello. Se manca, effettuare l'override dalla classe base.Creare una nuova
StringFormat
variabile denominatastyle
.StringFormat style = new();
Dim style As New StringFormat
Il System.Drawing.StringFormat tipo incapsula le informazioni sul layout del testo e fornisce l'accesso all'allineamento.
In base a
TextAlignment
, impostare lastyle.Alignment
proprietà sul valore appropriato.style.Alignment = TextAlignment switch { // Map the HorizontalAlignment enum to the StringAlignment enum HorizontalAlignment.Left => StringAlignment.Near, HorizontalAlignment.Right => StringAlignment.Far, HorizontalAlignment.Center => StringAlignment.Center, // Default to Near alignment _ => StringAlignment.Near };
'Map the HorizontalAlignment enum to the StringAlignment enum Select Case TextAlignment Case HorizontalAlignment.Left style.Alignment = StringAlignment.Near Case HorizontalAlignment.Right style.Alignment = StringAlignment.Far Case HorizontalAlignment.Center style.Alignment = StringAlignment.Center End Select
Disegna la proprietà
Text
conGraphics.DrawString
.// Create the brush and automatically dispose it. using SolidBrush foreBrush = new(ForeColor); // Call the DrawString method to write text. // Text, Font, and ClientRectangle are inherited properties. pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
'Create the brush and automatically dispose it. Using foreBrush As New SolidBrush(ForeColor) 'Call the DrawString method to write text. 'Text, Font, and ClientRectangle are inherited properties. e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style) End Using
Importante
Il
Graphics.DrawString
metodo utilizza un oggettoBrush
per il colore del testo.Brushes
deve essere eliminato dopo l'utilizzo.Il Graphics.DrawString metodo usa testo, un tipo di carattere, un colore e opzioni di formattazione per disegnare una stringa.
Chiamare
base.OnPaint
per assicurarsi che l'eventoPaint
venga generato.base.OnPaint(pe);
MyBase.OnPaint(e)
Salvare il file di codice e compilare il progetto. Dopo la compilazione del progetto, Visual Studio aggiunge il controllo personalizzato alla finestra casella degli strumenti quando si apre Progettazione oggetti visivi.
Il codice dovrebbe essere simile al frammento di codice seguente:
public partial class FirstControl : Control
{
private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
[System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)]
public HorizontalAlignment TextAlignment
{
get => _textAlignment;
set
{
_textAlignment = value;
Invalidate();
}
}
public FirstControl()
{
InitializeComponent();
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
StringFormat style = new();
style.Alignment = TextAlignment switch
{
// Map the HorizontalAlignment enum to the StringAlignment enum
HorizontalAlignment.Left => StringAlignment.Near,
HorizontalAlignment.Right => StringAlignment.Far,
HorizontalAlignment.Center => StringAlignment.Center,
// Default to Near alignment
_ => StringAlignment.Near
};
// Create the brush and automatically dispose it.
using SolidBrush foreBrush = new(ForeColor);
// Call the DrawString method to write text.
// Text, Font, and ClientRectangle are inherited properties.
pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
base.OnPaint(pe);
}
}
Public Class FirstControl
Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
<System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)>
Public Property TextAlignment As HorizontalAlignment
Get
Return _textAlignment
End Get
Set(value As HorizontalAlignment)
_textAlignment = value
Invalidate()
End Set
End Property
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim style As New StringFormat
'Map the HorizontalAlignment enum to the StringAlignment enum
Select Case TextAlignment
Case HorizontalAlignment.Left
style.Alignment = StringAlignment.Near
Case HorizontalAlignment.Right
style.Alignment = StringAlignment.Far
Case HorizontalAlignment.Center
style.Alignment = StringAlignment.Center
End Select
'Create the brush and automatically dispose it.
Using foreBrush As New SolidBrush(ForeColor)
'Call the DrawString method to write text.
'Text, Font, and ClientRectangle are inherited properties.
e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style)
End Using
MyBase.OnPaint(e)
End Sub
End Class
Contenuti correlati
.NET Desktop feedback