Ответ 1
В Rectangle нет дочернего контента, поэтому вам нужно будет поместить оба элемента управления внутри другой панели, например сетку:
<Grid>
<Rectangle Stroke="Red" Fill="Blue"/>
<TextBlock>some text</TextBlock>
</Grid>
Вы также можете использовать элемент управления Border, который возьмет один дочерний элемент и нарисует вокруг него прямоугольник:
<Border BorderBrush="Red" BorderThickness="1" Background="Blue">
<TextBlock>some text</TextBlock>
</Border>
Вы говорите "динамический прямоугольник", поэтому звучит так, будто вы делаете это в коде. Эквивалентный С# будет выглядеть примерно так:
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" },
});
Но если вам нужен динамический список прямоугольников, вы, вероятно, должны использовать ItemControl:
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Red" BorderThickness="1" Background="Blue">
<TextBlock Text="{Binding Text}"/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Если вы установите DataContext в список объектов, этот XAML создаст Border с TextBlock для каждого из них с текстом, установленным в свойство Text объекта.