如何在Canvas上预测XAML Label的高度

时间:2013-09-23 23:39:56

标签: c# xaml canvas

我有一个应用程序,我需要动态地将内容构建到Canvas。一切都很好,但我不知道如何以最安全的方式设置标签的y坐标。例如,我需要添加三个基本上是文本行的标签。在Java Swing或C#GDI中,我只查询行高的字体,并将该值添加到drawText命令的y坐标。

这是我的代码。

double y = 0.0;
_line1.Content = "Line1";
_line1.SetValue(Canvas.TopProperty, y);
_line1.SetValue(Canvas.LeftProperty, 0.0);
CanvasChart.Children.Add(_line1);
double textHeight = _line1.Height;

y += textHeight;
_line2.Content = "Line2";
_line2.SetValue(Canvas.TopProperty, 0.0);
_line2.SetValue(Canvas.LeftProperty, y);
CanvasChart.Children.Add(_line2);

这不起作用,因为_line1.Height似乎没有设置为此时有用的任何内容。我想它还没有渲染。上面的代码是在窗口的加载事件中。 ActualHeight也没有帮助。

我见过的大多数代码似乎只是将它们设置为硬编码值。我认为在开发人员的显示器上看起来正确,你只希望看起来擅长其他分辨率/ DPI。在Swing和GDI中,我总是得到最好的结果,找出字符串将被渲染的确切像素数,并使用它来偏移下一行。

2 个答案:

答案 0 :(得分:1)

您必须调用Measure方法,指定无限可用大小。这将更新控件的DesiredSize

_line1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
double textHeight = _line1.DesiredSize.Height;

实现所需效果的另一种简单方法是将标签放在StackPanel

答案 1 :(得分:1)

  

在Swing和GDI中,我总是得到最好的结果,找出字符串将被渲染的确切像素数,并使用它来抵消下一行。

这也适用于WPF。 GlyphTypeface类为字体中的每个字符提供AdvanceWidthsAdvanceHeights属性。通过使用CharacterToGlyphMap,您可以将字符映射到AdvanceHeights中的索引,并使用它来确定任何字符的实际高度。

有关详细示例,请参阅GlyphRun and So Forth