2010-04-16 16 views
6

Sto lavorando a un progetto che aggiorna l'interfaccia utente dell'applicazione WinForms per essere più coerente con le dimensioni. I controlli TextBox e ComboBox hanno altezze diverse per impostazione predefinita, anche con lo stesso carattere. Sono stato in grado di ridimensionare le caselle di testo disattivando AutoSize, ma il testo abbraccia ancora la parte superiore del controllo, lasciando uno spazio sottostante.C# WinForms Allineamento verticale per TextBox, ecc.

C'è un modo per centrare il testo verticalmente nel controllo?

risposta

7

Se stai spegnendo AutoSize su un controllo, deve essere un Label, dal momento che TextBox non ha una proprietà AutoSize. La proprietà TextAlign di un Label è di tipo ContentAligment, quindi è possibile impostare l'allineamento orizzontale e verticale.

Per vari motivi noiosi, i riquadri di testo in Windows hanno lo scopo di regolare automaticamente le loro altezze sul carattere utilizzato. Per controllare le altezze e centrare verticalmente il testo, puoi creare rapidamente un UserControl personalizzato con cui puoi sostituire tutte le tue caselle di testo.

Sul controllo utente, impostare BorderStyle su Fixed3D e BackColor su System.Window. Aggiungi un TextBox e imposta il suo BorderStyle su Nessuno. Nell'evento Ridimensiona per il controllo, aggiungi il codice che rende il TextBox della stessa larghezza dell'area client del controllo utente (che conta i pixel del bordo) e lo allinea a sinistra (ovvero) e lo centra verticalmente (ad esempio textBox1.Top = (this.Height - textBox1.Height)/2;).

Infine, aggiungi al controllo utente qualsiasi proprietà ed eventi di tipo TextBox necessari (probabilmente solo Testo e TextChanged, suppongo) e collegali in modo che passino al TextBox all'interno del tuo controllo, come questo :

public string Text 
{ 
    get 
    { 
     return textBox1.Text; 
    } 
    set 
    { 
     textBox1.Text = value; 
    } 
} 

Se si voleva ottenere super-fantasia con questo, si potrebbe anche sostituire proprietà TextAlign di controllo utente con uno che è in realtà di tipo ContentAlignment (come il Label) e quindi allineare il TextBox interno da abbinare.

Questo stesso approccio funzionerà con un ComboBox, anche se apparirà leggermente strano. Con ComboBox, si imposta la proprietà FlatStyle su Flat, altrimenti si gestisce lo stesso come un TextBox. Sembrerà strano perché la casella freccia a discesa non sarà abbastanza nella parte superiore e inferiore del pannello.

+5

Proprio come una FYI, esiste infatti una proprietà AutoSize su TextBoxes. Semplicemente non verrà visualizzato nella finestra delle proprietà o completato automaticamente a causa di alcune decorazioni degli attributi. Ma myTextBox.AutoSize = false; verrà compilato e inserendolo nel costruttore di un controllo ereditato si otterrà una casella di testo ridimensionabile. – Clyde

+1

Notato.Sono passati anni da quando ho smesso di provare a rendere i controlli di Windows diversi dagli standard, quindi sono un po 'arrugginito. È interessante notare che l'Intellisense dice "Questa proprietà non è rilevante per questa classe", anche se ovviamente * è * (impostarla su false rende effettivamente l'altezza regolabile). – MusiGenesis

+0

Suppongo che la risposta più semplice sia: passare a WPF. Tutto ha una proprietà VerticalContentAlignment e HorizontalContentAlignment. – MusiGenesis

1

un po 'tardi, ma qui la risposta facile ..

creare un controllo vuota e includere il vostro testo come un bambino, poi, quando il controllo padre o la casella di testo ridimensionare riallineare il vostro controllo casella di testo in mezzo verticale

rimuovere i bordi, rendere il bk dello stesso colore del genitore (predefinito)

oh, sovrascrivere il carattere per impostare il carattere della casella di testo e penso che si abbia la propria casella di testo valign.

0

Una soluzione molto semplice consiste nell'utilizzare un Datagridview con intestazioni di 1 colonna, 1 riga, colonna e riga non visibili e impostare DefaultCellStyle.Alignment = MiddleLeft.

E disabilitare l'aggiunta/eliminazione di righe e si dispone di una casella di testo che allinea perfettamente il testo.

Problemi correlati