开发者

how to calculate 'Size' of FormattedText or GlyphRun in wpf?

开发者 https://www.devze.com 2023-03-21 04:49 出处:网络
In WPF4, how can i calculate the \'Size\' of FormattedText or GlyphRun for a drawingvisual. I\'m using drawingvisu开发者_如何学Goal in a canvas. When i change text size or text, changes occur but Act

In WPF4, how can i calculate the 'Size' of FormattedText or GlyphRun for a drawingvisual.

I'm using drawingvisu开发者_如何学Goal 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消