Simple Tile Horizontally / Tile Vertically functionality in WPF
Here is the main idea: We will have a grid with three rows and three columns. The middle column/row will be used to store the GridSplitter that will allow us to resize columns/rows once we are in one of the tile modes. So basically when we are in Tile Horizontally we will span the textboxes (the same can be doen with any other control) to take all the three columns. And if we are in Tile Vertically mode we will change the columns of the controls and will Span the controls so they take all the rows.
But enough talking, lets get to work:
XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="3" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="3" />
<RowDefinition/>
</Grid.RowDefinitions>
<TextBox x:Name="txtTextBoxTop"
Grid.Row="0" Grid.Column="0"
Grid.ColumnSpan="3"
/>
<GridSplitter x:Name="split"
Grid.Row="1" Grid.Column="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ResizeDirection="Rows"
/>
<TextBox x:Name="txtTextBoxBottom"
Grid.Row="2" Grid.Column="0"
Grid.ColumnSpan="3"
/>
</Grid>
And here is the code that will change to one of the modes:
VB Code Behind:
Private Sub cmdTileHorizontally_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Grid.SetColumn(txtTextBoxTop, 0)
Grid.SetRow(txtTextBoxTop, 0)
Grid.SetColumnSpan(txtTextBoxTop, 3)
Grid.SetRowSpan(txtTextBoxTop, 1)
Grid.SetColumn(split, 0)
Grid.SetRow(split, 1)
Grid.SetColumnSpan(split, 3)
Grid.SetRowSpan(split, 1)
split.ResizeDirection = GridResizeDirection.Rows
Grid.SetColumn(txtTextBoxBottom, 0)
Grid.SetRow(txtTextBoxBottom, 2)
Grid.SetColumnSpan(txtTextBoxBottom, 3)
Grid.SetRowSpan(txtTextBoxBottom, 1)
End Sub
Private Sub cmdTileVerically_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Grid.SetColumn(txtTextBoxTop, 0)
Grid.SetRow(txtTextBoxTop, 0)
Grid.SetColumnSpan(txtTextBoxTop, 1)
Grid.SetRowSpan(txtTextBoxTop, 3)
Grid.SetColumn(split, 1)
Grid.SetRow(split, 0)
Grid.SetColumnSpan(split, 1)
Grid.SetRowSpan(split, 3)
split.ResizeDirection = GridResizeDirection.Columns
Grid.SetColumn(txtTextBoxBottom, 2)
Grid.SetRow(txtTextBoxBottom, 0)
Grid.SetColumnSpan(txtTextBoxBottom, 1)
Grid.SetRowSpan(txtTextBoxBottom, 3)
End Sub
It is simple as that! And as a bonus you even get resizing 🙂