Нужно добавить текст в прямоугольник - PullRequest
13 голосов
/ 29 августа 2010

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

Ответы [ 3 ]

33 голосов
/ 29 августа 2010

Прямоугольник не имеет дочернего содержимого, поэтому вам нужно поместить оба элемента управления в другую панель, например в сетку:

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

4 голосов
/ 21 июня 2016

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

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);
1 голос
/ 29 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...