here's the thought: put everything in a grid. Let the grid automatically resize, place the canvas on the grid (make sure it occupies the entire grid) so that it matches the size of the parent:
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Canvas Background="Transparent" Grid.RowSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<Border Width="450" BorderThickness="1">
<Expander etc />
</Border>
<OtherControls Grid.Row="1"/>
</Grid>
not sure how appropriate this is, but check out this post. Maybe this will give you some ideas (I wrote that 4 years ago I remembered specifics for too long, but it compiles and runs the code):
http://denismorozov.blogspot.com/2008/01/how-to-resize-wpf-controls-at-runtime.html
source
share