2009-12-31 7 views
0

내 응용 프로그램에 트리 사용자 정의 그 룹 구조가있는 캔버스가 포함 된 스크롤 뷰어가 있습니다. 캔버스에서 스크롤 뷰어를 기준으로 특정 노드 요소의 위치를 ​​가져 오려고합니다 (스크롤 할 수 있도록 스크롤 할 수는 있지만). 그러나 시도는 작동하지 않습니다.캔버스 내의 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 등을 사용하여이 문제를 해결할 수 있지만이 방법은 지저분하고 복잡합니다 (항상 왼쪽 및 위쪽으로 정렬되지는 않으므로).

어떻게 해결할 수 있습니까? 아니면 캔버스에서만 작동하지 않습니까?

+0

질문 : 캔버스는 상단 및 왼쪽의 오프셋을 기준으로 항목을 정렬하도록 제한하지 않습니까? 캔버스의 오른쪽이나 아래쪽에 정렬 할 수 없습니다. 어쩌면 내가 틀렸어 ... –

+0

아니, Canvas.SetBottom과 Canvas.SetRight도 사용할 수 있습니다. –

답변

1

이 문제에 대한 간단한 해결 방법을 작성했습니다. 그것은 작동하지만 아주 깨끗하지는 않습니다. 누군가가 이것에 대한 답을 가지고 있다면 나는 그것을 고맙게 생각합니다! 현재 사용중인 코드는 다음과 같습니다.

private static Point GetCanvasChildPosition(FrameworkElement element) 
{ 
    var canvas = element.Parent as Canvas; 

    double left = Canvas.GetLeft(element); 
    double top = Canvas.GetTop(element); 

    bool isLeftAligned = !double.IsNaN(left); 
    bool isTopAligned = !double.IsNaN(top); 

    double x; 
    double y; 

    if (isLeftAligned) 
    { 
     x = left; 
    } 
    else 
    { 
     x = canvas.Width - Canvas.GetRight(element) - element.Width; 
    } 

    if (isTopAligned) 
    { 
     y = top; 
    } 
    else 
    { 
     y = canvas.Height - Canvas.GetBottom(element) - element.Height; 
    } 

    return new Point(x, y); 
} 
1

VisualTreeHelper.GetOffset(Visual obj)을 사용해 보셨나요? 저는 Studio 앞에서는 아니지만, 과거에 이런 종류의 작업을 위해 이것을 사용하여 회상 한 것 같습니다 ...

+0

이것은 불행히도 이전처럼 (0,0)을 제공합니다. –

+0

흠 ... 이건 어리석은 질문처럼 들리 겠지만, 쓴 코드는 언제 불려지나요? 사용자가 시작한 이벤트 핸들러? 초기화시에? 구성? 기타? 여기에 대한 대답은 아마도 당신이 실제로 아직 완성되지 않은 UI 비트에 대한 세부 정보를 끌어 내려고 시도하는 것입니다 ... – JerKimball

+0

기본적으로 현재 선택된 노드로 스크롤하려면 가져 오려고합니다. 이는 사용자 상호 작용의 결과로 항상 발생하지만 트리가 올바르게 렌더링 된 지점을 기준으로합니다. –