Zmiana rozmiaru elementów płótna

Próbuję stworzyć płótno, które zmienia rozmiar swoich dzieci, gdy rozmiar płótna zostanie zmieniony. Tworzę więc własną klasę, która dziedziczy z canvas i zastępuje metodę ArrangeOverride, w której ustawiam pozycje i rozmiary dla wszystkich dzieci zdefiniowanych w canvas. Wszystko wygląda dobrze, ale gdy zmieniam rozmiar okna aplikacji, elementy nie zostały przeskalowane do prawidłowego rozmiaru lub pozycji.

Jest to uproszczony przykład, który próbuje przyciągnąć swoje elementy do prawej krawędzi płótna:

Kod Xamla:

<Border BorderBrush="Black" BorderThickness="1" Margin="10" SnapsToDevicePixels="True">
    <l:CustomPanel>
        <Rectangle Fill="Red" />
        <Button>a</Button>
    </l:CustomPanel>
</Border>

CustomPanel:

public class CustomPanel : Canvas
{
    protected override System.Windows.Size ArrangeOverride(System.Windows.Size arrangeSize)
    {
        var ret = base.ArrangeOverride(arrangeSize);
        var top = 0;

        foreach(UIElement child in Children)
        {                               
            Canvas.SetLeft(child, arrangeSize.Width - 20.0);                
            child.SetValue(WidthProperty, arrangeSize.Width - Canvas.GetLeft(child));                
            Canvas.SetTop(child, top);
            child.SetValue(HeightProperty, 20.0);
            top += 30;
        }
        return ret;
    }
}

Kiedy zmieniam szerokość okna, czasami płótno wygląda jak na tym obrazie:

A następnie, jeśli zmienię wysokość okna, elementy przesuną się do właściwej pozycji

Co ja robię źle? Próbowałem ustawić SnapsToDevicePixels na True i nie działa to dla mnie. :-(

questionAnswers(3)

yourAnswerToTheQuestion