내 응용 프로그램에 트리 사용자 정의 그 룹 구조가있는 캔버스가 포함 된 스크롤 뷰어가 있습니다. 캔버스에서 스크롤 뷰어를 기준으로 특정 노드 요소의 위치를 가져 오려고합니다 (스크롤 할 수 있도록 스크롤 할 수는 있지만). 그러나 시도는 작동하지 않습니다.캔버스 내의 TranslatePoint
나는 marker.TranslatePoint(new Point(0, 0), scrollViewer)
(여기에서 은 캔버스의 요소 임)을 사용해 보았습니다. 그러나 이는 마커가 아닌 캔버스의 위치를 반환하는 것입니다. 마찬가지로, 내가 marker.TranslatePoint(new Point(0, 0), layoutCanvas)
을 시도하면 마커의 위치에 관계없이 항상 (0,0)
을 얻게됩니다.
여기 내 코드입니다 : 나는 또한 marker.TransformToVisual(scrollViewer).Transform(new Point(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;
하지만,이 같은 결과를 제공합니다.
Canvas.GetLeft
, Canvas.GetTop
등을 사용하여이 문제를 해결할 수 있지만이 방법은 지저분하고 복잡합니다 (항상 왼쪽 및 위쪽으로 정렬되지는 않으므로).
어떻게 해결할 수 있습니까? 아니면 캔버스에서만 작동하지 않습니까?
질문 : 캔버스는 상단 및 왼쪽의 오프셋을 기준으로 항목을 정렬하도록 제한하지 않습니까? 캔버스의 오른쪽이나 아래쪽에 정렬 할 수 없습니다. 어쩌면 내가 틀렸어 ... –
아니, Canvas.SetBottom과 Canvas.SetRight도 사용할 수 있습니다. –