Прямоугольник не имеет дочернего содержимого, поэтому вам нужно поместить оба элемента управления в другую панель, например в сетку:
<Grid>
<Rectangle Stroke="Red" Fill="Blue"/>
<TextBlock>some text</TextBlock>
</Grid>
Вы также можете использовать элемент управления Border, который возьмет одного ребенка и нарисует вокруг него прямоугольник:
<Border BorderBrush="Red" BorderThickness="1" Background="Blue">
<TextBlock>some text</TextBlock>
</Border>
Вы говорите «динамический прямоугольник», так что, похоже, вы делаете это в коде. Эквивалентный C # будет выглядеть примерно так:
var grid = new Grid();
grid.Children.Add(new Rectangle() { Stroke = Brushes.Red, Fill = Brushes.Blue });
grid.Children.Add(new TextBlock() { Text = "some text" });
panel.Children.Add(grid);
// or
panel.Children.Add(new Border()
{
BorderBrush = Brushes.Red,
BorderThickness = new Thickness(1),
Background = Brushes.Blue,
Child = new TextBlock() { Text = "some text" },
});
Но если вам нужен динамический список прямоугольников, вам, вероятно, следует использовать ItemsControl:
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Red" BorderThickness="1" Background="Blue">
<TextBlock Text="{Binding Text}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Если вы установите DataContext в список объектов, этот XAML создаст границу с TextBlock для каждого из них с текстом, установленным для свойства Text объекта.