Have you set explicit sizes on your canvases? Canvases don't size to fit their content, so unless you specify the size of the canvas explicitly, when you put them all in a stack panel, their contents will appear on top of each other, as you explain. This is because the (0,0) position to which canvas children are positioned relative to will be the top-left of the stackpanel (the same point for all canvases and all their children).
Try the following in Kaxaml to highlight the situation:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<StackPanel>
<Canvas>
<TextBlock Text="Child of canvas one" />
</Canvas>
<Canvas>
<TextBlock Text="Child of canvas two" />
</Canvas>
</StackPanel>
</Page>
You'll see the two lines of text are superimposed on top of one another.
Now, try this:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<StackPanel>
<Canvas Height="15">
<TextBlock Text="Child of canvas one" />
</Canvas>
<Canvas Height="15">
<TextBlock Text="Child of canvas two" />
</Canvas>
</StackPanel>
</Page>
And you'll see the spacing you desire.
Hope that helps.