web-dev-qa-db-ja.com

WPFのウィンドウ内の要素の絶対位置を取得

ダブルクリックされたときに、window/root要素に対する要素の絶対位置を取得したいと思います。親内の要素の相対的な位置は、私が到達できるように見えるすべてであり、私が到達しようとしているのは、ウィンドウに相対的なポイントです。画面上ではなく、ウィンドウ内で要素のポイントを取得する方法のソリューションを見てきました。

78
BrandonS

BrandonSが望んでいるのは、ルート要素に対するmouseの位置ではなく、子孫要素の位置です。

そのために、 TransformToAncestor メソッドがあります:

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

ここで、myVisualはダブルクリックされた要素であり、rootVisualはApplication.Current.MainWindowまたは任意の相対位置です。

114
Robert Macnee

ウィンドウ内の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;
37
Filip

このメソッドを静的クラスに追加します。

 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に設定します。

15
Andreas

この質問は古いことは知っていますが、.NET 3.0以降では、単に*yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)を使用できます。

これにより、ボタンのポイント0、0が得られますが、コンテナに向かっています。 (0、0という別のポイントを与えることもできます)

ドキュメントについてはこちらをご覧ください

3
Guibi