Попробуйте переопределить ArrangeOverride или OnRender для родительского элемента управления. WPF выполняет трехэтапный проход макета / рендеринга: сначала он запрашивает элементы управления, сколько места им нужно (измерить), затем он сообщает элементам управления, сколько места они фактически дали всем полученным запросам (упорядочить), а затем фактически рисует все внутри областей, которым был задан каждый элемент управления (render). Для того, чтобы это работало, следует визуальное дерево - корневой элемент (скажем, Window) должен измеряться; он должен попросить своих детей измерить, кто должен спросить своих детей и т. д. вплоть до элементов листа, прежде чем все это начнет возвращаться обратно к корню. Затем начинается проход аранжировки и, наконец, проход рендеринга.
Наблюдая за детским OnRender, вы неявно заявляете, что хотите начать рисовать после того, как измерение и аранжировка произошли, но до того, как родитель начнет рисовать сам. Это можно сделать эквивалентным родительскому OnRender, который включает в себя детский OnRenders. Вы также могли бы сделать это в родительском ArrangeOverride, который оборачивает проход аранжировки детей, в котором (IIRC) фактически устанавливаются значения, к которым обращается VisualTreeHelper.GetOffset (), доступ к которым осуществляется на самом деле.
Наконец, глядя на родительский элемент управления, вы неявно ждете, пока все дочерние элементы управления завершат аранжировку / рендеринг, а это означает, что вам не придется разбираться, пытаясь выяснить, когда последний дочерний элемент завершил рендеринг. .