In WPF4, how can i calculate the 'Size'
of FormattedText
or GlyphRun
for a drawingvisual
.
I'm using drawingvisual in a canvas. When i change text size or text, changes occur but Actual Width and Height are same or don't get updated.
Using dc As DrawingContext = drawingvisual.RenderOpen
Dim ft As New FormattedText(...)
dc.DrawText(ft, New Point(0, 0))
dc.Close()
End Using
Once you've initialized the FormattedText, it has Width and Height members that are equal to its actual rendered size given its parameters. In fact, changing parameters updates them immediately, 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 for GlyphRun: When you created your GlyphRun you already gave it the advance widths for each character, so you add those for the width. To get the height, use the GlyphTypeface.Baseline * FontSize
Just as a side note: I've notice around 10x performance increase when using DrawingContext.DrawGlyphRun vs DrawingContext.DrawFormattedText.
GlyphRun is not well-documented, but once you read this article you should be able to understand how it works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With