У меня есть средство просмотра прокрутки в моем приложении, которое содержит холст, в котором у меня есть дерево, построенное на основе дерева. Я пытаюсь получить позицию конкретного элемента узла в холсте относительно средства просмотра прокрутки (чтобы я мог прокручивать его), но мои попытки не работают.TranslatePoint в пределах холста
Я пробовал использовать marker.TranslatePoint(new Point(0, 0), scrollViewer)
(где - элемент на холсте), но это просто возвращает положение холста, а не маркер. Аналогично, если я попробую marker.TranslatePoint(new Point(0, 0), layoutCanvas)
, я всегда получаю (0,0)
как результат, независимо от того, где на самом деле находится маркер.
Вот мой код:
var marker = m_Metadata[node].Marker;
var location = marker.TranslatePoint(new Point(0, 0), scrollViewer); // This inorrectly gives the position of the canvas, rather than the marker.
var size = new Size(marker.Width, marker.Height);
var markerArea = new Rect(location, size);
double horizontalOffset = (markerArea.Right + markerArea.Left - scrollViewer.ViewportWidth)/2;
double verticalOffset = (markerArea.Bottom + markerArea.Top - scrollViewer.ViewportHeight)/2;
Я также попытался с помощью marker.TransformToVisual(scrollViewer).Transform(new Point(0, 0)
, но это дает те же результаты.
Я могу обойти его, используя Canvas.GetLeft
, Canvas.GetTop
и др., Но это грязно и запутанно (поскольку они не всегда будут выровнены по левому краю и выровнены по высоте).
Как я могу исправить это, или он просто не работает для холстов?
Вопрос: не позволяет ли холст выровнять элементы на основе смещения сверху и слева? Вы не можете выровнять по правому краю или снизу на холсте. Возможно, я ошибаюсь ... –
Нет, вы также можете использовать Canvas.SetBottom и Canvas.SetRight. –