Your problem is that Canvas panels do not resize to fit their content.
You refered to Measure and Arrange. Are you familiar with WPF's two pass layout system? Read this article for more information: WPF's Layout System.
This article also describes what different panels do for layout. Each type of panel is different.
In WPF, elements are first given an opportunity to determine what size they will be. Panels can determine their size based on the size of their children, or they can ask for fixed size regardless of the size of their children. Canvas is an example of the latter.
Elements are next told what size they will be and asked to arrange themselves and their children.
The Grid panel type not only allows rows and columns, but is also very good at auto sizing to content.
The StackPanel type does not autosize at all in the dimension in which it is oriented, but it will autosize in the other dimension.
Canvas can auto size to fill a space, but it never allows it's children to auto size. It draws its children at the specified coordinates and does not care how big they are.
I would suggest trying a Grid with only one row/column.
Or you could create a new Canvas class that has better autosizing capabilities. During measure, you would want to measure the child elements and size your Canvas accordingly. You might find a class like this helpful down the road.
Here's an article on Auto Layout in WPF.
If you want to create a custom panel, here's a subtopic on it: Custom Panel Elements.
EDIT:
One more thing: You can also bind the width/height of the child element to the ActualWidth and ActualHeight properties on the canvas so that the child will adjust the size of its parent. You can use a converter to set a size ratio if necessary.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…