Como posso conseguir essa mistura de comportamento de StackPanel e UniformGrid?

Eu quero colocar elementos dentro de um controle para que eles inicialmente se encaixem assim (como um StackPanel com orientação horizontal):

insira a descrição da imagem aqui

Mas, quando os elementos se empilharem ao ponto de não caberem mais na canvas, quero que eles comecem a se comportar assim:

insira a descrição da imagem aqui

Como um UniformGrid : conforme o número de elementos aumenta, eles se tornam menores.

Qual seria a melhor ou outra maneira de fazer isso? Como o tamanho do controle externo é variável (depende do tamanho da canvas do usuário), não posso “hackear” o mesmo para usar um componente ou outro, dependendo do número de elementos, porque não posso prever o número necessário para “quebrar” a canvas.

Rota mais fácil / mais ViewBox , jogá-lo em um ViewBox com ele definido como Stretch="Uniform" para fazer isso por você, como um exemplo como abaixo, basta adicionar / subtrair retângulos e você terá o conceito …

               

Espero que isto ajude. Felicidades