2010-10-19 13 views
14

Nel processo di traduzione di un'applicazione con C# + Winforms, ho bisogno di cambiare il testo di un pulsante a seconda della lingua.Come ridimensionare un pulsante a seconda del suo testo

Il mio problema è il seguente: "Ciao a tutti"

Diciamo che voglio tradurre un pulsante da a "Bonjour tout le monde"!

Come si può intuire, la dimensione del pulsante non sarà la stessa se inserisco testo inglese o francese ... La mia domanda è "semplice", come posso riuscire a ridimensionare il pulsante al volo in modo che il testo si adatta al suo contenuto nel pulsante?

Finora ho ottenuto qualcosa del genere!

[Ciao a tutti!]

[Bonjour]

risposta

19

La cosa migliore è quella di impostare la proprietà AutoSize come descritto ach's answer

Tuttavia, se AutoSize non funziona per voi, il ridimensionamento del pulsante il codice è abbastanza facile. Hai solo bisogno di impostare la larghezza del pulsante. Il trucco sta diventando abbastanza grande da adattarsi al tuo testo.

using(Graphics cg = this.CreateGraphics()) 
    { 
     SizeF size = cg.MeasureString("Please excuse my dear aunt sally",this.button1.Font); 

     // size.Width+= 3; //add some padding .net v1.1 and 1.0 only 
     this.button1.Padding = 3; 
     this.button1.Width = (int)size.Width; 

     this.button1.Text = "Please excuse my dear aunt sally"; 
    } 
+0

Grazie mille! –

+0

Non dovresti aggiungere il padding? 'this.button1.Width = (int) size.Width + button1.Padding.Left + button1.Padding.Right;'. E se hai un'immagine a destra oa sinistra del testo, dovresti aggiungere la larghezza dell'immagine. –

+0

@ OlivierJacot-Descombes Sulla base della [cronologia delle revisioni] (http://stackoverflow.com/posts/3965742/revisions) ho pensato anch'io e poi ho cambiato la mia risposta. Dal momento che c'è una risposta superiore (Andrew's) e sarebbe facile per chiunque stia usando questa risposta per determinare se è necessario tenere conto del riempimento nella dimensione o non ho intenzione di rifiutare di modificare questa risposta. –

24

Non c'è assolutamente alcuna necessità di utilizzare il sottostante Graphics oggetto come gli altri utenti hanno detto.

Se si imposta la proprietà del pulsante AutoSize true, il AutoSizeMode a GrowAndShrink, e il AutoEllipsis su false, si ridimensiona automaticamente per adattarsi al testo.

Detto questo, potrebbe essere necessario effettuare diverse regolazioni del layout per rendere questa modifica adatta all'interfaccia utente. È possibile regolare il riempimento del pulsante per aggiungere spazio attorno al testo e si consiglia di posizionare i pulsanti in uno TableLayoutPanel (o qualcosa) per impedire che si sovrappongano quando vengono ridimensionati.

Edit: @mastro ha sottolineato che: AutoEllipsis è valido solo quando è AutoSizefalse (Come spiegato nel the documentation), in modo che possa essere ignorato fino a quando gli altri tre proprietà sono impostate correttamente.

+0

Per le necessità dell'OP, questa potrebbe essere una soluzione molto migliore perché sembra che si tratti di un secnario abbastanza semplice. Tuttavia l'affermazione "assolutamente non necessario" è fuorviante. MeasureString è uno dei migliori strumenti disponibili per un programmatore che costruisca moduli e controlli personalizzati. È anche utile per i programmatori web (tramite un gestore HTTP) per creare immagini di dimensioni precise basate su testo variabile. –

+2

@Tim - Non sto dicendo nulla di negativo su MeasureString, ha i suoi usi, ma questo non è inequivocabilmente uno di loro. Fare il codice con codice non necessario e arbitrario (larghezza + = 3) è una cattiva pratica. –

8

Prova questo:

Button.AutoSize = true; 
Button.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly; 
Button.TextAlign = ContentAlignment.MiddleLeft; 
Button.Padding = new Padding(0, 0, 0, 0); 
1

Come Andrew Hanlon spiega, è possibile impostare AutoSize = true.

Quando si esegue questa operazione, è inoltre possibile ottenere automaticamente un layout perfetto dei pulsanti posizionandoli su un FlowLayoutPanel.

La distanza orizzontale tra loro rimarrà sempre lo stesso quando la FlowDirection del FlowLayoutPanel è LeftToRight o RightToLeft. È possibile regolare questa distanza impostando opportunamente la proprietà Margin dei pulsanti. Puoi creare gruppi di pulsanti aumentando il margine sinistro dei pulsanti che iniziano un nuovo gruppo.

Se si imposta la proprietà Dock dei pulsanti per DockStyle.Fill, saranno anche crescere automaticamente la loro larghezza in modo da adattarsi al pulsante più ampio se la FlowDirection del FlowLayoutPanel è TopDown o BottomUp.

btn.AutoSizeMode = AutoSizeMode.GrowOnly; 
btn.AutoSize = true; 
btn.Dock = DockStyle.Fill; 
1

Per attivare un pulsante in WinForms crescere e/o ridurre a seconda delle dimensioni del testo, è necessario impostare la proprietà del pulsante AutoSize-True e la AutoSizeMode proprietà GrowAndShrink.

// C# 
btn.AutoSize = true; 
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink; 

' VB.NET 
btn.AutoSize = True 
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink 

Si prega di notare che la proprietà AutoSize consente solo dimensioni del pulsante a crescere se la proprietà è impostata su AutoSizeModeGrowOnly; modificando la proprietà AutoSizeMode su GrowAndShrink, il pulsante verrà automaticamente esteso o ridotto in larghezza e altezza in base alla proprietà Text.

Inoltre, nell'impostazione delle due proprietà come mostrato sopra, è possibile utilizzare nuove linee (Environment.NewLine o vbCrLf) nella proprietà Text e il pulsante si ridimensionerà in base alle esigenze.

Problemi correlati