Судя по отсутствию ответа, это не то, что другим людям приходится делать это часто, или на самом деле не существует ничего доступного, отвечающего всем требованиям. Я укусил пулю и начал писать свой собственный набор методов расширения для класса Canvas, начиная с GetContentBounds, для итерации дочерних элементов canvas и возврата ограничивающего прямоугольника ограничивающего прямоугольника содержимого.