Ваша проблема в том, что панели Canvas не меняются в соответствии с их содержанием.
Вы ссылались на Измерение и Аранжировка. Вы знакомы с двухпроходной системой макетов WPF? Прочтите эту статью для получения дополнительной информации: Система макетов WPF .
В этой статье также описывается, что разные панели делают для макета. Каждый тип панели отличается.
В WPF элементам сначала предоставляется возможность определить, какого размера они будут. Группы могут определять свой размер в зависимости от размера своих детей, или они могут запрашивать фиксированный размер независимо от размера своих детей. Холст является примером последнего.
Затем элементам сообщают, какого они размера, и просят договориться о себе и своих детях.
Тип панели «Сетка» не только допускает строки и столбцы, но также очень хорош при автоматическом изменении размера содержимого.
Тип StackPanel не имеет автоматического размера в измерении, в котором он ориентирован, но он будет автоматически изменяться в другом измерении.
Canvas может автоматически изменять размер, чтобы заполнить пробел, но он никогда не позволяет дочерним элементам автоматически изменять размер. Он рисует своих детей в указанных координатах и не заботится о том, насколько они велики.
Я бы предложил попробовать Сетка только с одной строкой / столбцом.
Или вы можете создать новый класс Canvas с улучшенными возможностями автоматического изменения размера. Во время измерения вы хотели бы измерить дочерние элементы и соответственно изменить размер вашего холста. Вы могли бы найти класс, как это полезно в будущем.
Вот статья о Auto Layout в WPF.
Если вы хотите создать пользовательскую панель, здесь есть подтема: Элементы пользовательской панели .
EDIT:
Еще одна вещь: вы также можете привязать ширину / высоту дочернего элемента к свойствам ActualWidth и ActualHeight на холсте, чтобы дочерний элемент регулировал размер его родителя. При необходимости вы можете использовать конвертер для установки соотношения размеров.