2013-06-04 12 views
16

Trovo il modo in cui la funzione DrawString interrompe interi caratteri o parole per essere controintuitivi. Mostrare parti del testo indica chiaramente che manca qualcosa.Come si usa DrawString senza tagliare?

ecco alcuni esempi:

StringTrimming.None: enter image description here

StringTrimming.Character: enter image description here

Quello che voglio: enter image description here (GIMP mockup)

E` StringTrimming.None la come StringTrimming.Character? Sembrano comportarsi esattamente allo stesso modo nel mio caso. C'è qualcosa che avrei potuto trascurare o è una "caratteristica" conosciuta?

In base allo standard docs StringTrimming.None "Non specifica trimming."

This site con esempi creati con Java anche mostrare "Nessuno" per tagliare più caratteri di "Carattere".

Ci sono altri trucchi per ottenere questo effetto?

Nota: non desidero visualizzare "..." o simili. Trovo che questo sia uno spreco di spazio ma probabilmente è una discussione per UX.

+0

sorry .. voglio solo sapere .. cosa vorresti applicare questo per? – matzone

+0

@Rotem Buona idea, ma questo rovinerà il wrapping nel caso in cui vi sia abbondanza di spazio verticale. Tuttavia, dovresti aggiungerlo come risposta. Funziona alla grande per le singole linee! – Sarien

+0

@matzone A DataGridView (una tabella per meno esperti di Windows Form). – Sarien

risposta

9

È possibile che il testo sembri ritagliato perché in realtà si avvolge invisibilmente sulla riga successiva. Nella chiamata a Graphics.DrawString, disabilitare involucro passando un oggetto la cui proprietà StringFormatFormatFlags è impostato su NoWrap:

StringFormat format = 
    new StringFormat 
    { 
     FormatFlags = StringFormatFlags.NoWrap, 
     Trimming = StringTrimming.None 
    }; 
g.DrawString(s, font, brush, rect, format); 
+1

+1 Scommetto che questo è quello che sta succedendo. –

+1

E 'possibile mantenere il wrapping e disabilitarlo solo quando non c'è abbastanza spazio per un'altra linea?(Potrei misurare tutto per farlo ma vorrei evitarlo.) – Sarien

+1

@Sarien: Non sembra esserci una bandiera per quello. Dovresti usare un'istruzione 'if' o'? ', E passare il flag' NoWrap' solo se l'altezza del rettangolo di disegno è inferiore al doppio dell'altezza della linea. –

4

Per risolvere il problema, si può dare il metodo DrawString un grande RectangleF di quanto si vuole veramente, e impostare l'area di ridimensionamento del Graphics oggetto per l'attuale RectangleF si desidera disegnare la stringa.

RectangleF rect = new RectangleF(10, 10, 30, 15); 
e.Graphics.DrawRectangle(Pens.Red, Rectangle.Truncate(rect)); 

RectangleF fakeRect = new RectangleF(rect.Location, new SizeF(short.MaxValue, short.MaxValue)); 

Region r = e.Graphics.Clip; 
e.Graphics.SetClip(rect);    
e.Graphics.DrawString("1 Default", this.Font, SystemBrushes.ControlText, fakeRect); 
e.Graphics.Clip = r; 

Si noti che questo codice presuppone che si desidera ancorare il testo all'angolo in alto a sinistra del rettangolo. Altrimenti dovresti generare il rettangolo falso in un metodo che mantiene lo stesso punto di ancoraggio del rettangolo di layout desiderato.

+0

Questo è probabilmente l'approccio migliore. Le opzioni di ritaglio 'DrawString()' riguardano la manipolazione della stringa prima della visualizzazione. Quello che vuoi, tuttavia, è visualizzare tutto e clip. – DonBoitnott