2

我有一个应用程序,我需要在其中将内容动态构建到 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 中,我总是能得到最好的结果,准确地找出一个字符串将在多少像素处渲染,并使用它来偏移下一行。

4

2 回答 2

1

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

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

另一种达到预期效果的简单方法是将标签放在StackPanel.

于 2013-09-23T23:44:08.657 回答
1

在 Swing 和 GDI 中,我总是能得到最好的结果,准确地找出一个字符串将在多少像素处渲染,并使用它来偏移下一行。

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

有关详细示例,请参阅GlyphRun 等

于 2013-09-23T23:44:41.093 回答