Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln lär du dig hur du skapar anpassad Windows Forms-kontroll. Den enkla kontroll som utvecklats i den här artikeln skriver ut kontrollens Text till vänster, i mitten eller till höger. Justeringen av texten kan ändras. Den här kontrollen genererar eller hanterar inte händelser.
I den här artikeln lär du dig hur du:
- Lägg till en egenskap och ett fält för att hantera den vågräta justeringsinställningen för texten.
 - Använd 
OnTextChangedför att ogiltigförklara kontrollen. - Ange kod i 
OnPaintmetoden för att rita text på kontrollens yta. 
Lägga till en anpassad kontroll
Det första steget är att lägga till en anpassad kontroll i projektet.
Leta reda på Solution Explorer-fönstret i Visual Studio. Högerklicka på projektet och välj Lägg till>nytt objekt.
              
              
            
Sök efter anpassad kontroll och välj den.
Ange filnamnet till FirstControl och välj Lägg till.
Om kontrollens designläge är synligt växlar du till kodvyn. Tryck på F7 eller välj länken växla till kodvy .
Tips/Råd
Du kan också högerklicka på filen i Solution Explorer-fönstret och välja Visa kod.
Nu bör du titta på källkoden för den anpassade kontrollen, som liknar följande kodfragment:
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
Lägga till en egenskap
Skapa en ny egenskap på kontrollen med namnet TextAlignment. Den här egenskapen justerar var texten målas på kontrollen. Utför följande steg med FirstControl klassen:
Lägg till ett fält med namnet
_textAlignmentav typenHorizontalAlignment.private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;Private _textAlignment As HorizontalAlignment = HorizontalAlignment.LeftOmslut fältet i en egenskap med namnet
TextAlignment. När du ställer in egenskapen anroparInvalidatedu metoden för att tvinga kontrollen att måla om sig själv.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 PropertyLägg till följande attribut i egenskapen för att integrera den med fönstret Egenskaper i Visual Studio.
Category– Den kategori som tillämpas på egenskapen.Description—Beskrivningen av egendomen.DefaultValue– Ett standardvärde för egenskapen.Standardvärdet gör att egenskapen kan återställas av designern. Den hjälper också till att avgöra när egenskapen ska serialiseras till koden bakom, eftersom standardvärdena inte serialiseras.
[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
Hantera ändrad text
Egenskapen TextAlignment anropar Invalidate så att kontrollen ommålar sig själv. Detta säkerställer att rätt justering omedelbart används vid återgivning av Text av kontrollen. Men om egenskapen Text ändras uppdateras ingenting eftersom Text inte anropar Invalidate. Egenskapen anropar faktiskt OnTextChanged-metoden, som du kan åsidosätta för att kalla på Invalidate och tvinga kontrollen att rita om sig.
Utför följande steg med FirstControl klassen:
- Åsidosätt metoden 
OnTextChanged. - Anropa 
base.OnTextChangedför att höja händelsenTextChanged, som förväntat av dem som använder kontrollen. - 
              
InvalidateAnropa metoden för att framtvinga ommålning. 
Koden bör se ut som följande kodfragment:
protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
    MyBase.OnTextChanged(e)
    Invalidate()
End Sub
Måla kontrollen
Den sista delen av den anpassade kontrollen är målning. Utför följande steg med FirstControl klassen:
Leta upp den
OnPaintmetod som genereras av mallen. Om den saknas, skriv över den från basklassen.Skapa en ny
StringFormatvariabel med namnetstyle.StringFormat style = new();Dim style As New StringFormatTypen System.Drawing.StringFormat kapslar in textlayoutinformation och ger åtkomst till justering.
Baserat på
TextAlignment, ställ instyle.Alignment-egenskapen till lämpligt värde.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 SelectRita egenskapen
TextmedGraphics.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 UsingViktigt!
Metoden
Graphics.DrawStringanvänder enBrushför textens färg.Brushesmåste kasseras efter användning.Metoden Graphics.DrawString använder text, teckensnitt, färg och formateringsalternativ för att rita en sträng.
Anropa
base.OnPaintför att säkerställa att händelsenPainthar aktiverats.base.OnPaint(pe);MyBase.OnPaint(e)Spara kodfilen och kompilera projektet. När projektet har kompilerats lägger Visual Studio till den anpassade kontrollen i fönstret Verktygslåda när du öppnar Visual Designer.
Koden bör se ut som följande kodfragment:
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
Relaterat innehåll
.NET Desktop feedback