ウィンドウ内の座標を取得する

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になってしまう。一度描画されれば、正しく取得できるんだけど。リフレッシュってどうやるんだっけ。