ダブルクリックされたときに、window/root要素に対する要素の絶対位置を取得したいと思います。親内の要素の相対的な位置は、私が到達できるように見えるすべてであり、私が到達しようとしているのは、ウィンドウに相対的なポイントです。画面上ではなく、ウィンドウ内で要素のポイントを取得する方法のソリューションを見てきました。
BrandonSが望んでいるのは、ルート要素に対するmouseの位置ではなく、子孫要素の位置です。
そのために、 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
に設定します。
この質問は古いことは知っていますが、.NET 3.0以降では、単に*yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)
を使用できます。
これにより、ボタンのポイント0、0が得られますが、コンテナに向かっています。 (0、0という別のポイントを与えることもできます)