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ただし、 (および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

You cant get the width before a layout pass... But what you could try is setting the Label to Visibility of Hidden (not Collapsed), then attach a Loaded event, and set its position then change back the visibility?

于 2012-12-06T02:42:07.537 に答える
0

やってみました:

double pos = Canvas.GetLeft(lbl);

これがレイアウトパスの前に機能するかどうかはわかりませんが、試してみる価値はあります

于 2012-12-06T02:56:30.010 に答える