Need to add text to rectangle

前端 未结 3 1051
野趣味
野趣味 2020-12-09 04:37

I am creating Dynamic Rectangle and adding into StackPanel. I need to add text to each rectangle. How can I do that?

相关标签:
3条回答
  • 2020-12-09 05:22

    You need to add a textual control to your StackPanel, such as Label or TextBlock.

    0 讨论(0)
  • 2020-12-09 05:27

    A Rectangle doesn't have any child content, so you will need to put both controls inside of another panel, such as a grid:

    <Grid>
        <Rectangle Stroke="Red" Fill="Blue"/>
        <TextBlock>some text</TextBlock>
    </Grid>
    

    You can also use a Border control, which will take a single child and draw a rectangle around it:

    <Border BorderBrush="Red" BorderThickness="1" Background="Blue">
        <TextBlock>some text</TextBlock>
    </Border>
    

    You say "dynamic rectangle", so it sounds like you are doing this in code. The equivalent C# would look something like this:

    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" },
    });
    

    But if you want a dynamic list of rectangles, you should probably use an ItemsControl:

    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="Red" BorderThickness="1" Background="Blue">
                    <TextBlock Text="{Binding Text}"/>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    If you set the DataContext to a list of objects, this XAML will create a Border with a TextBlock for each one with the text set to the Text property on the object.

    0 讨论(0)
  • 2020-12-09 05:30

    First of all you can do this, but not by adding the control. And there is a very good reason to do this, for high speed hardware rendering. You can create a special brush from a UI element that caches itself in hardware and fill the rectangle with this hardware, and it is extremely fast. I will just show the code behind because it is the example I have offhand

    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);
    
    0 讨论(0)
提交回复
热议问题