Search code examples
c#.netwpfpixelsense

How to force text into a specific width?


I use a GridView to display my layout. To this GridView i manually add some RowDefinitions and in this RowDefinitions I add 1 Canvas containing 2 rectangles:

 foreach (Method m in sourceFile.getMethods())
            {
                if (!m.getName().StartsWith("<") && !m.getName().EndsWith(">"))
                {
                    RowDefinition row = new RowDefinition();
                    row.Height = GridLength.Auto;
                    MethodsContainer.RowDefinitions.Add(row);

                    Canvas c = new Canvas();
                    c.Width = width;
                    c.Height = height;
                    c.Tag = m;
                    Contacts.AddPreviewContactDownHandler(c, new ContactEventHandler(onContactDown));

                    Rectangle r1 = new Rectangle();
                    r1.Height = height;
                    r1.Width = m.getLoc() * (width / 1000);
                    Canvas.SetLeft(r1, 0);
                    Canvas.SetLeft(r1, 0);
                    r1.Fill = Brushes.Red;

                    Rectangle r2 = new Rectangle();
                    r2.Height = height;
                    r2.Width = width - r1.Width;
                    Canvas.SetTop(r2, 0);
                    Canvas.SetLeft(r2, r1.Width);
                    r2.Fill = Brushes.Blue;

                    c.Children.Add(r1);
                    c.Children.Add(r2);

                    Grid.SetRow(c, rowCounter);
                    MethodsContainer.Children.Add(c);
                    rowCounter++;
                }
            }

The canvas is 200px width and 30px height. Both rectangles fill the Canvas exactly. Now i want to add some text over this both Rectangles. But I don't know how long the text is. However I want to force that the text is always printed into this 200px. How can I achieve that?


Solution

  • Sounds like you could make use of a ViewBox. This will make your text stretch both horizontally and vertically. I assume that's what you want if I understood the question correctly. Example in xaml

    <Canvas Width="200"
            Height="30">
        <Viewbox Width="200"
                 Height="30">
            <TextBlock Text="Text that will fit in 200 Width"/>
        </Viewbox>
    </Canvas>
    

    And in code behind it will be like

    TextBlock textBlock = new TextBlock();
    textBlock.Text = "Text that will fit in 200 Width";
    
    Viewbox viewBox = new Viewbox();
    viewBox.Width = width;
    viewBox.Height = height;
    viewBox.Child = textBlock;
    
    c.Children.Add(viewBox);