Прежде чем добавить его, вызовите Measure для него, затем используйте DesiredSize.
Edit: Это нормально, поскольку Canvas не влияет на размер элемента после его размещения.Если вы добавите его, скажем, в Grid со строкой фиксированного размера, это не даст вам реальную высоту после добавления, поскольку добавление в Grid изменит ее.
Как указывает Марио Вернари,если у вас есть действительно сложные потребности позиционирования, довольно легко переопределить ArrangeOverride (и иногда MeasureOverride) и создать собственную панель.Canvas на самом деле написан таким же образом, как и StackPanel и т. Д. Все они представляют собой просто панели с определенными размерами и компоновкой, и вы тоже можете создавать свои собственные.