我有一个应用程序,我需要动态地将内容构建到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中,我总是得到最好的结果,找出字符串将被渲染的确切像素数,并使用它来偏移下一行。
答案 0 :(得分:1)
您必须调用Measure
方法,指定无限可用大小。这将更新控件的DesiredSize
:
_line1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
double textHeight = _line1.DesiredSize.Height;
实现所需效果的另一种简单方法是将标签放在StackPanel
。
答案 1 :(得分:1)
在Swing和GDI中,我总是得到最好的结果,找出字符串将被渲染的确切像素数,并使用它来抵消下一行。
这也适用于WPF。 GlyphTypeface
类为字体中的每个字符提供AdvanceWidths
和AdvanceHeights
属性。通过使用CharacterToGlyphMap
,您可以将字符映射到AdvanceHeights
中的索引,并使用它来确定任何字符的实际高度。
有关详细示例,请参阅GlyphRun and So Forth。