ウィンドウ内の座標を取得する
CanvasとかをセンタリングしているとMargin.LeftやTopでは実際の座標が取れない。
そこでこんなのでいけるようだ。
public static Point PointToWindow(UIElement element, Point pointOnElement) { Window wnd = Window.GetWindow(element); if (wnd == null) { throw new InvalidOperationException("target element is not yet connected to the Window drawing surface"); } return element.TransformToAncestor(wnd).Transform(pointOnElement); }
情報源:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/bc232a1c-71c5-40ed-a437-a2e94ca5648f/
しかし、ダメなときがあるな。Canvasをコード内で生成して、Marginを明示的に設定した場合、画面が再描画されるまでWindow内の位置がまだ確定していないため、一回目の取得値がが0,0になってしまう。一度描画されれば、正しく取得できるんだけど。リフレッシュってどうやるんだっけ。