Archive for the ‘Layouts’ tag
WrapPanel in WPF
In my previous post I had written about StackPanel. One big disadvantage with the StackPanel was with the wrapping part. It cannot wrap controls / contents when it overflows. Thats why we have the WrapPanel. This is StackPanel + Wrap enabled. The following example may help you understand this better.
Consider that you have a stack panel with 7 buttons arranged in a horizontal fashion and if your window’s width is smaller than the sum of seven button’s width, then this how it looks
<Window x:Class="LayoutsTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel Orientation="Horizontal">
<Button Content="Button1" VerticalAlignment="Center" />
<Button Content="Button2" VerticalAlignment="Center" />
<Button Content="Button3" VerticalAlignment="Center" />
<Button Content="Button4" VerticalAlignment="Center" />
<Button Content="Button5" VerticalAlignment="Center" />
<Button Content="Button6" VerticalAlignment="Center" />
<Button Content="Button7" VerticalAlignment="Center" />
</StackPanel>
</Window>
A close substitute for this problem will be a WrapPanel.
<Window x:Class="LayoutsTest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <WrapPanel Orientation="Horizontal"><Button Content="Button1" VerticalAlignment="Center" /> <Button Content="Button2" VerticalAlignment="Center" /> <Button Content="Button3" VerticalAlignment="Center" /> <Button Content="Button4" VerticalAlignment="Center" /> <Button Content="Button5" VerticalAlignment="Center" /> <Button Content="Button6" VerticalAlignment="Center" /> <Button Content="Button7" VerticalAlignment="Center" /> </WrapPanel> </Window>
Although this solves the Wrap problem of the stack panel, still we cannot place two controls paralle to each other using this panel.
DockPanel in WPF
As the name says you can dock your controls in to either Top, Left, Right or Bottom of the panel. Placing a control to a location can be done using the Dock property with the values Left, Top, Right and Bottom.
ln1: <DockPanel> ln2: <Button DockPanel.Dock="Top" Content="Button1" /> ln3: <Button DockPanel.Dock="Bottom" Content="Button2" /> ln4: <Button DockPanel.Dock="Left" Content="Button3" /> ln5: <Button DockPanel.Dock="Right" Content="Button4" /> ln6: <Button Content="Button5" /> ln7: </DockPanel>
This will dock the button1 to the top of the container, button2 to the bottom and so on.
The order in which we dock the controls matters in here. If we move ln4 to ln3 and ln3 to ln4, the layout will look different.
If you dock a control to a location, the control will remain docked to that location irrespective to the size of the container. Take a look at the schreenshot shown below (with the container maximised).
Although this allows us to fix some controls to any edge of the container, we cannot position controls explicitly using this panel.
StackPanel (Layout) in WPF
Like .Net 2.0, WPF provides a set of layouts that allows the users to easily place the controls in to it. Lets look in to it, one by one comparing with the net 2.0 version of it.
StackLayout
This was called as FlowLayout in .net 2. Controls that are added in to this layout will be automatically aligned either in a vertical or in a horizontal fashion. This alignment depends on the value of Orientaion property. The value can either be Vertical or Horizontal.
Vertical Orientation
<StackPanel Orientation="Vertical"> <Button Content="Button1" /> <Button Content="Button2" /> </StackPanel>
Horizontal Orientation
<StackPanel Orientation="Horizontal"> <Button Content="Button1" /> <Button Content="Button2" /> </StackPanel>
If you notice the screenshots, you will find that the width of the button is automatically controlled by the WPF framework. Thats why the buttons are stretched. But if you wanna control the width, you can play with the HorizontalAlignment property of the control. The default alignment is Stretched. Specifying a width for the control along with the HorizontalAlignment property allows you to have total control on the size and location of the control.
<StackPanel Orientation="Vertical"> <Button Content="Button1" /> <Button Content="Button2" HorizontalAlignment="Left" /> <Button Content="Button3" HorizontalAlignment="Right" /> <Button Content="Button4" HorizontalAlignment="Center" /> <Button Content="Button5" HorizontalAlignment="Stretch" /> </StackPanel>
We can see this layout in action in loads of places. For example, the search tool that comes with windows has employed this layout.
Although this layout lets the us relax on alignments, we cannot place two controls parallel to each other (this layout is not intented to do so. we have another layout for this, GridLayout). Also this layout cannot wrap controls when the controls overflow (again this layout is not intented to do so. we have another layout for this, WrapPanel).






