Grid Layout in WPF

A Grid is a very powerful and useful Layout in WPF. It enables you to arrange children elements in cells defined by rows and columns. In fact, when we add a new XAML document or create a new WPF Project in Visual Studio, Visual Studio automatically adds a Grid as the first container inside the window element.

We can create Rows and Columns in the following two ways.

First Method: By typing XAML Code

By default, a Grid has one row and one column. We can add more rows and columns by adding a RowDefinition Element for each row inside the Grid.RowDefinitions property and a ColumnDefinition Element for each column inside the Grid.ColumnDefinitions property. By default, GridLines are invisible. For showing the GridLines, set the ShowGridLines property of the Grid to True. GridLines are helpful during debugging for determining which element is in which cell.

Let's understand it with a simple example. In this example, we have created 3 rows and 3 columns. Then added 9 TextBlocks and mainted the TextBlock position inside the grid by specifying the Grid.Row and Grid.Column values. If we don't specify a Grid.Row and Grid.Column property then an Element is placed in Grid.Row="0" and Grid.Column="0", in other words in First Row and First Column.

<Window x:Class="GridLayoutExample1.MainWindow"    
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
        Title="MainWindow" Height="350" Width="525">    
    <Grid ShowGridLines="True">    
        <Grid.ColumnDefinitions>    
            <ColumnDefinition></ColumnDefinition>    
            <ColumnDefinition></ColumnDefinition>    
            <ColumnDefinition></ColumnDefinition>    
        </Grid.ColumnDefinitions>    
        <Grid.RowDefinitions>    
            <RowDefinition></RowDefinition>    
            <RowDefinition></RowDefinition>    
            <RowDefinition></RowDefinition>    
        </Grid.RowDefinitions>    
        <TextBlock Text="Row0 Column0" Grid.Row="0" Grid.Column="0" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row0 Column1" Grid.Row="0" Grid.Column="1" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row0 Column2" Grid.Row="0" Grid.Column="2" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column0" Grid.Row="1" Grid.Column="0" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column1" Grid.Row="1" Grid.Column="1" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column2" Grid.Row="1" Grid.Column="2" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row2 Column0" Grid.Row="2" Grid.Column="0" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row2 Column1" Grid.Row="2" Grid.Column="1" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row2 Column2" Grid.Row="2" Grid.Column="2" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
    </Grid>    
</Window>

Preview

Second Method: By Clicking on Margin

We can control a column's width and a row's height in the following 3 ways.

1) Automatic Sizing

Rows and columns are sized automatically to fit the content/child element.

Example:

<Grid ShowGridLines="True">    
        <Grid.ColumnDefinitions>    
            <ColumnDefinition Width="auto"></ColumnDefinition>    
            <ColumnDefinition Width="auto"></ColumnDefinition>    
        </Grid.ColumnDefinitions>    
        <Grid.RowDefinitions>    
            <RowDefinition Height="auto"></RowDefinition>    
            <RowDefinition Height="auto"></RowDefinition>    
        </Grid.RowDefinitions>    
        <Button Content="Row0 column0" FontSize="16" Grid.Row="0" Grid.Column="0"></Button>    
        <Button Content="Row0 column1" FontSize="16" Grid.Row="0" Grid.Column="1"></Button>    
</Grid>

Preview

2) Absolute Sizing

In Absolute Sizing, the exact size of the height and width is specified in RowDefinition and ColumnDefinition. The size of the row and column does not shrink or expand when the size of the Grid/window is changed.

<Grid ShowGridLines="True">    
        <Grid.ColumnDefinitions>    
            <ColumnDefinition Width="200"></ColumnDefinition>    
            <ColumnDefinition Width="325"></ColumnDefinition>    
        </Grid.ColumnDefinitions>    
        <Grid.RowDefinitions>    
            <RowDefinition Height="100"></RowDefinition>    
            <RowDefinition Height="100"></RowDefinition>    
            <RowDefinition Height="150"></RowDefinition>    
        </Grid.RowDefinitions>    
        <TextBlock Text="Row0 Column0" Grid.Row="0" Grid.Column="0" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row0 Column1" Grid.Row="0" Grid.Column="1" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column0" Grid.Row="1" Grid.Column="0" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column1" Grid.Row="1" Grid.Column="1" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row2 Column0" Grid.Row="2" Grid.Column="0" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row2 Column1" Grid.Row="2" Grid.Column="1" FontSize="16" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>    
</Grid>

 Preview

3) Proportional Sizing

In proportional sizing, the available space is divided proportionally among columns and rows.

For example, I have created 3 columns of width *,*,2*. That means the width of Column0 is 1/4th, the width of column1 is 1/4th and the width of column2 is 2/4th of the grid. In the same way, I have divided the height of the rows. A proportional-sized row or column shrinks and grows in size on the changing of the grid size.

<Grid ShowGridLines="True">    
        <Grid.ColumnDefinitions>    
            <ColumnDefinition Width="*"></ColumnDefinition>    
            <ColumnDefinition Width="*"></ColumnDefinition>    
            <ColumnDefinition Width="2*"></ColumnDefinition>    
        </Grid.ColumnDefinitions>    
        <Grid.RowDefinitions>    
            <RowDefinition Height="*"></RowDefinition>    
            <RowDefinition Height="3*"></RowDefinition>    
        </Grid.RowDefinitions>    
        <TextBlock Text="Row0 Column0" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row0 Column1" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row0 Column2" Grid.Row="0" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column0" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column1" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>    
        <TextBlock Text="Row1 Column2" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>    
</Grid>

Preview

Using a Grid is much similar to working with a table in HTML. We can also merge/span rows and columns using the Grid.ColumnSpan and Grid.RowSpan property.

<Grid ShowGridLines="True">    
        <Grid.ColumnDefinitions>    
            <ColumnDefinition Width="*"></ColumnDefinition>    
            <ColumnDefinition Width="*"></ColumnDefinition>    
            <ColumnDefinition Width="*"></ColumnDefinition>    
        </Grid.ColumnDefinitions>    
        <Grid.RowDefinitions>    
            <RowDefinition Height="*"></RowDefinition>    
            <RowDefinition Height="*"></RowDefinition>    
            <RowDefinition Height="2*"></RowDefinition>    
        </Grid.RowDefinitions>    
        <TextBlock Text="Merging top 3 Cells" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18"></TextBlock>    
        <TextBlock Text="Rowspan=2" Grid.Row="1" Grid.Column="0" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18"></TextBlock>    
        <TextBlock Text="Rowspan=2 Colspan=2" Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18"></TextBlock>    
</Grid>

Preview

I hope you like it. Thanks.