Как получить WPF Canvas, чтобы поместить TextBlock и Polygon в одно и то же место? - PullRequest
2 голосов
/ 21 мая 2011

Как мне получить объект WPF Canvas для рендеринга TextBlock и Polygon в одной и той же позиции?Я пытаюсь наложить 2D-метки на 3D-сцену, но хотя фоны Polygon заканчиваются в нужных местах, TextBlocks не ...

Вы можете увидеть результаты здесь.

(я знаю, что было бы лучше использовать объекты Границы вместо полигонов, но они также не правильно позиционируются!)

Вот код, который я использую, чтобы попробовать и сделатьэто:

foreach (Block block in blocks)
{
    GeneralTransform3DTo2D transform = block.Top.TransformToAncestor(viewport);
    GeometryModel3D model = block.Top.Content as GeometryModel3D;
    MeshGeometry3D geometry = model.Geometry as MeshGeometry3D;
    Point corner1 = transform.Transform(geometry.Positions[geometry.TriangleIndices[0]]);
    Point corner2 = transform.Transform(geometry.Positions[geometry.TriangleIndices[1]]);
    Point middle = new Point(corner1.X / 2 + corner2.X / 2, corner1.Y / 2 + corner2.Y / 2);

    Polygon polygon = new Polygon();
    polygon.Stroke = Brushes.DimGray;
    polygon.Fill = Brushes.LightGray;
    polygon.Points.Add(new Point(middle.X - 15, middle.Y - 15));
    polygon.Points.Add(new Point(middle.X + 15, middle.Y - 15));
    polygon.Points.Add(new Point(middle.X + 15, middle.Y + 15));
    polygon.Points.Add(new Point(middle.X - 15, middle.Y + 15));
    labelHolder.Children.Add(polygon);

    TextBlock text = new TextBlock();
    text.Text = block.Text;
    text.Width = 30;
    text.Height = 30;
    text.TextAlignment = TextAlignment.Center;
    text.FontSize = 11;
    Canvas.SetLeft(text, middle.X - 15);
    Canvas.SetBottom(text, middle.Y - 15);
    labelHolder.Children.Add(text);
}

Буду очень признателен, если вы поможете мне взять под контроль мой холст, спасибо!

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Ага, ответ таков: вам нужно указать Right и Top , а также Left и Bottom, чтобы убедиться, что он расположен именно там, где вы хотите ...

Canvas.SetLeft(border, middle.X - border.Width / 2);
Canvas.SetRight(border, middle.X + border.Width / 2);
Canvas.SetBottom(border, middle.Y + border.Height / 2);
Canvas.SetTop(border, middle.Y - border.Height / 2);
0 голосов
/ 21 мая 2011

Вы пытались поместить сетку туда, где вы хотите, чтобы ваш полигон, а затем поместили полигон и текстовый блок в сетку? В сетке элементы будут перекрывать друг друга, если вы не остановите их от этого. В этом случае вы не захотите их останавливать. Вы могли бы даже возиться с тем, где находится ваш TextBox по отношению к стенам сетки, чтобы он был там, где вы хотели, над полигоном.

...