code

wpf에서 창 내 요소의 절대 위치 가져 오기

codestyles 2020. 10. 7. 07:41
반응형

wpf에서 창 내 요소의 절대 위치 가져 오기


두 번 클릭하면 창 / 루트 요소와 관련된 요소의 절대 위치를 얻고 싶습니다. 부모 내에서 요소의 상대적 위치는 내가 도달 할 수있는 모든 것이며, 내가 도달하려는 것은 창에 대한 상대적인 지점입니다. 나는 화면에서 요소의 포인트를 얻는 방법에 대한 솔루션을 보았지만 창에는 없습니다.


BrandonS가 원하는 것은 루트 요소에 상대적인 마우스 의 위치가 아니라 일부 하위 요소의 위치입니다.

이를 위해 TransformToAncestor 메서드가 있습니다.

Point relativePoint = myVisual.TransformToAncestor(rootVisual)
                              .Transform(new Point(0, 0));

myVisual방금 두 번 클릭 한 요소는 어디에 있고 rootVisualApplication.Current.MainWindow 또는 원하는 위치를 기준으로합니다.


창 내 UI 요소의 절대 위치를 얻으려면 다음을 사용할 수 있습니다.

Point position = desiredElement.PointToScreen(new Point(0d, 0d));

사용자 컨트롤 내에 있고 해당 컨트롤 내에서 UI 요소의 상대적 위치를 원하는 경우 다음을 사용하면됩니다.

Point position = desiredElement.PointToScreen(new Point(0d, 0d)),
controlPosition = this.PointToScreen(new Point(0d, 0d));

position.X -= controlPosition.X;
position.Y -= controlPosition.Y;

이 메서드를 정적 클래스에 추가합니다.

 public static Rect GetAbsolutePlacement(this FrameworkElement element, bool relativeToScreen = false)
    {
        var absolutePos = element.PointToScreen(new System.Windows.Point(0, 0));
        if (relativeToScreen)
        {
            return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
        }
        var posMW = Application.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0));
        absolutePos = new System.Windows.Point(absolutePos.X - posMW.X, absolutePos.Y - posMW.Y);
        return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
    }

전체 화면의 왼쪽 상단에서 배치 하거나 응용 프로그램 창의 왼쪽 상단에서 배치 relativeToScreen하려면 매개 변수를 true설정 false합니다.


이 질문이 오래되었다는 것을 알고 있지만 .NET 3.0 이후로는 *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*).

이것은 버튼의 0, 0 지점을 제공하지만 컨테이너쪽으로 향합니다. (당신은 또한 0, 0이라는 다른 점을 줄 수 있습니다)

여기에서 문서를 확인하세요.


흠. Mouse.GetPosition(IInputElement relativeTo)다음 코드 에서 클릭 한 창을 지정해야 합니다.

protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        Point p = e.GetPosition(this);
    }

자신의 클래스가 아니라 응용 프로그램의 다른 지점에서 창을 참조해야한다고 생각합니다. 이 경우 Application.Current.MainWindow도움이 될 것입니다.

참고 URL : https://stackoverflow.com/questions/386731/get-absolute-position-of-element-within-the-window-in-wpf

반응형