【问题标题】:Can I know width of TextBlock when create it?创建时我可以知道 TextBlock 的宽度吗?
【发布时间】:2011-10-10 08:54:50
【问题描述】:

我像这样在 Canvas 上创建 TextBox:

        TextBlock t = new TextBlock();
        t.Foreground = new SolidColorBrush(...);
        t.FontSize = 10;
        t.HorizontalAlignment = HorizontalAlignment.Left;
        t.VerticalAlignment = VerticalAlignment.Top;
        t.Text = ...;

        Canvas.SetLeft(t, "f(width)");
        Canvas.SetTop(t, ...);                

        canvas.Children.Add(t);

我想知道这个TextBlock的宽度,因为左坐标取决于这个。 我可以做吗?实际宽度为 0。 谢谢。

【问题讨论】:

  • 我以为你在 WPF 中没有“宽度”。您必须使用边距/填充来确定它如何适合它的容器。你是什​​么意思左坐标取决于它?你想做什么?
  • @musefan 有 Width 和 Height 属性以及 ActuallWidth 和 ActualHeight

标签: c# .net wpf width textblock


【解决方案1】:

在添加之前,对其调用 Measure,然后使用 DesiredSize。

编辑: 这样做是可以的,因为 Canvas 不会影响放置后元素的大小。如果您将其添加到具有固定大小行的 Grid 中,则一旦添加,这将不会为您提供真正的高度,因为添加到 Grid 会改变它。

正如 Mario Vernari 所指出的,如果您有真正复杂的定位需求,则可以很容易地覆盖 ArrangeOverride(有时是 MeasureOverride)并制作自定义面板。 Canvas 实际上就是这样写的,StackPanel 等也是这样写的。它们都是特定的测量和排列面板,你也可以自己制作。

【讨论】:

  • 我在这里投票。但是,在将元素附加到可视化树之前调用 Measure 并不是一个好习惯。
  • @Mario,在某些情况下是肯定的,但是当添加到 Canvas 时,可视化树不会影响大小,您可以安全地传递 +infinity、+infinity 的大小测量。
  • 我知道。当您的控件也没有孩子时,您可以这样做,但我不鼓励这种做法。相反,我更喜欢从 Canvas(或 Panel)派生出我自己的控件,然后编写我的自定义定位系统。更优雅...
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2011-03-31
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多