0

我正在尝试创建以画布上不同列为中心的标签。这段代码看起来很合理:

string[] titles = { "Acorn", "Banana", "Chrysanthemum" };
double col = 20.0;
foreach (string s in titles) 
{
    var lbl = new Label() { Content = s };
    lbl.SetValue(Canvas.LeftProperty, col - (lbl.Width / 2.0));
    myCanvas.Children.Add(lbl);
    col += 150.0;
}

但它不起作用,因为lbl.Width(and lbl.ActualWidth) 直到渲染才计算,这是在创建标签很久之后。

有没有办法在Label.Width布局操作之前获得准确的信息?在CanvasGrids 或 StackPanels 中,并不是所有的控件布局和流程。

4

3 回答 3

1

诀窍是使用 Measure 方法询问组件它想要的大小。如果使用 double.PositiveInfinity 值指定无限可用空间,则可以使用控件的 DesiredSize 属性来获得其理想的、未剪裁的、未流动的大小。

此代码显示了有效的解决方案:

  string[] titles = { "Acorn", "Banana", "Chrysanthemum" };
  double col = 20.0;
  foreach (string s in titles) {
    var lbl = new Label() { Content = s };
    lbl.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    lbl.SetValue(Canvas.LeftProperty, col - (lbl.DesiredSize.Width / 2.0));
    myCanvas.Children.Add(lbl);
    col += 150.0;
  }
于 2012-12-06T03:33:08.390 回答
0

您无法在布局通过之前获得宽度...但是您可以尝试将Labelto Visibilityof Hidden(not Collapsed) 设置为,然后附加一个Loaded事件,并设置其位置,然后改回可见性?

于 2012-12-06T02:42:07.537 回答
0

你有没有尝试过:

double pos = Canvas.GetLeft(lbl);

我不确定这在布局通过之前是否有效,但值得一试

于 2012-12-06T02:56:30.010 回答