Как узнать координаты объекта, если якоря не в центре (Canvas, 2d)?

В C# можно узнать координаты объекта на Canvas с использованием свойства RenderTransformOrigin и метода TransformToAncestor. Если якоря не находятся в центре объекта, то нужно сначала определить позицию якоря относительно самого объекта, а затем его преобразовать в координаты Canvas.

Вот пример кода, который поможет вам получить координаты объекта на Canvas:

// Получение координат объекта на Canvas
private Point GetCanvasCoordinates(FrameworkElement element)
{
    // Получение позиции якоря объекта относительно самого элемента
    Point anchorPoint = new Point(element.ActualWidth * element.RenderTransformOrigin.X,
                                  element.ActualHeight * element.RenderTransformOrigin.Y);

    // Преобразование позиции якоря в координаты Canvas
    GeneralTransform transform = element.TransformToAncestor(canvas);
    Point canvasCoordinates = transform.TransformPoint(anchorPoint);

    return canvasCoordinates;
}

В этом коде мы сначала определяем позицию якоря объекта относительно самого объекта. Для этого мы умножаем ширину и высоту объекта на значения свойства RenderTransformOrigin, которые указывают на позицию якоря относительно размеров объекта (от 0 до 1).

Затем мы используем метод TransformToAncestor, чтобы преобразовать координаты якоря объекта в координаты Canvas. Метод TransformToAncestor требует ссылки на Canvas (canvas в данном случае) в качестве параметра.

В конце мы возвращаем полученные координаты объекта на Canvas.

Вы можете вызвать этот метод, передавая в него объект, для которого вы хотите получить координаты на Canvas:

Point coordinates = GetCanvasCoordinates(myObject);
double x = coordinates.X;
double y = coordinates.Y;

Теперь вы знаете, как получить координаты объекта на Canvas, даже если якоря не находятся в центре.