2011-07-16 13 views
6

In WPF4, come posso calcolare lo 'Size' di FormattedText o GlyphRun per un drawingvisual.come calcolare "Dimensione" di FormattedText o GlyphRun in wpf?

Sto usando il disegno visivo su una tela. Quando cambio la dimensione del testo o il testo, le modifiche si verificano ma la larghezza e l'altezza effettive sono uguali o non vengono aggiornate.

Using dc As DrawingContext = drawingvisual.RenderOpen      

       Dim ft As New FormattedText(...) 

       dc.DrawText(ft, New Point(0, 0)) 

       dc.Close() 

End Using 

risposta

6

Una volta inizializzato il FormattedText, ha Larghezza e Altezza membri che sono pari alla sua dimensione reale reso dato i suoi parametri. In effetti, la modifica dei parametri li aggiorna immediatamente, e, g ,:

FormattedText ft = new FormattedText(cellString, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, fontFace, fontSize, fontBrush); 
ft.Trimming = TextTrimming.CharacterEllipsis; 
double originalHeight = ft.Height; 
double width = ft.Width; 
ft.MaxTextWidth = bCellRect.Width; // Set the width to get a new height 
double height = ft.Height; 

Edit per GlyphRun: quando hai creato il tuo GlyphRun che già ha dato la larghezza di anticipo per ogni personaggio, quindi si aggiungono quelli per la larghezza . Per ottenere l'altezza, utilizzare GlyphTypeface.Baseline * FontSize

+0

Che dire di 'GlyphRun'? – Code0987

+0

Quando hai creato il tuo GlyphRun gli hai già dato le larghezze di avanzamento per ogni carattere, quindi aggiungi quelle per la larghezza. Per ottenere l'altezza, usa GlyphTypeface.Baseline * FontSize. –

+0

Modifica la tua risposta e aggiungi "GlyphRun" ad essa. – Code0987

3

Proprio come una nota a margine: ho notato un aumento di circa 10 volte il rendimento quando si utilizza DrawingContext.DrawGlyphRun vs DrawingContext.DrawFormattedText.

GlyphRun non è ben documentato, ma una volta letto this article dovresti essere in grado di capire come funziona.