ダブルクリックしたときのウィンドウ/ルート要素に対する要素の絶対位置を取得したいと思います。親内の要素の相対位置は、私が到達できるように見えるすべてであり、私が到達しようとしているのは、ウィンドウに対する相対的なポイントです。画面上ではなく、ウィンドウ上で要素のポイントを取得する方法の解決策を見てきました。
回答:
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
はあなたを助けます。