【问题标题】:How can I predict a XAML Label's height on a Canvas如何在画布上预测 XAML 标签的高度
【发布时间】: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 中,我只需要知道文本元素有多大,这样我就可以确保它们不会重叠(与其他文本和线条重叠)。跨度>

标签: c# xaml canvas


【解决方案1】:

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

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

实现预期效果的另一种简单方法是将标签放在StackPanel 中。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2022-01-25
      • 2023-03-19
      相关资源
      最近更新 更多