Подтвердить что ты не робот

Нужно добавить текст в прямоугольник

Я создаю динамический прямоугольник и добавляю его в StackPanel. Мне нужно добавить текст в каждый прямоугольник. Как я могу это сделать?

4b9b3361

Ответ 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 объекта.

Ответ 2

Прежде всего, вы можете сделать это, но не добавив элемент управления. И для этого есть очень веская причина для высокоскоростной аппаратной рендеринга. Вы можете создать специальную кисть из элемента пользовательского интерфейса, который кэширует себя в аппаратном обеспечении и заполняет прямоугольник этим оборудованием, и это очень быстро. Я просто покажу код позади, потому что это пример, который я сделал из-за границы

Rectangle r = new Rectangle();
r.Stroke = Brushes.Blue;
r.StrokeThickness = 5;
r.SetValue(Grid.ColumnProperty, 1);
r.VerticalAlignment = VerticalAlignment.Top;
r.HorizontalAlignment = HorizontalAlignment.Left;
r.Margin = new Thickness(0);
r.Width = 200;
r.Height = 200;
r.RenderTransform = new TranslateTransform(100, 100);
TextBlock TB = new TextBlock();
TB.Text = "Some Text to fill";
//The next two magical lines create a special brush that contains a bitmap rendering of the UI element that can then be used like any other brush and its in hardware and is almost the text book example for utilizing all hardware rending performances in WPF unleashed 4.5
BitmapCacheBrush bcb = new BitmapCacheBrush(TB);
r.Fill = bcb;
MyCanvas.Children.Add(r);

Ответ 3

Вам нужно добавить текстовый элемент управления в свой StackPanel, например Label или TextBlock.