두 번 클릭 할 때 창 / 루트 요소와 관련된 요소의 절대 위치를 얻고 싶습니다. 부모 내의 요소의 상대적 위치는 내가 도달 할 수있는 모든 것이며 내가 도달하려는 것은 창에 대한 상대적인 지점입니다. 나는 화면에서 요소의 포인트를 얻는 방법에 대한 솔루션을 보았지만 창에는 없습니다.
답변:
BrandonS가 원하는 것은 루트 요소와 관련된 마우스 의 위치가 아니라 일부 하위 요소의 위치입니다.
이를 위해 TransformToAncestor 메서드가 있습니다.
Point relativePoint = myVisual.TransformToAncestor(rootVisual)
.Transform(new Point(0, 0));
myVisual
방금 두 번 클릭 한 요소는 어디에 있으며 rootVisual
Application.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
합니다.
RenderTransform
요소 를 수정하여 이미지를 화면 안팎으로 슬라이드하는 애니메이션과 함께 사용 하고 있으므로 화면에서 요소의 절대 위치를 알아야합니다.
.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
도움이 될 것입니다.