【发布时间】:2013-09-23 23:39:55
【问题描述】:
我有一个应用程序,我需要在其中将内容动态构建到 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 中,我总是能得到最好的结果,准确地找出一个字符串将在多少像素处渲染,并使用它来偏移下一行。
【问题讨论】:
-
看来您应该使用
StackPanel或类似的东西。这样,控件将自动定位。 WPF 并非旨在手动布局控件。 -
通常我会使用 StackPannel 之类的东西。但在这种情况下,我将一个有点复杂的图表渲染到 Canvas 中,我只需要知道文本元素有多大,这样我就可以确保它们不会重叠(与其他文本和线条重叠)。跨度>