DockPanel, as another Panel element, can be compared with
StackPanel. They are similar in manner except that DockPanel tries to dock
elements to Top, Bottom, Left and Right.
What DockPanel does depends on the order of its children
elements when you declare them in XAML. Let us take a look at how this element
lays out other elements.
DockPanel has some Attached Properties in its children.
Each of its children has a DockPanel.Dock which represents the position of that
element in DockPanel.
Your elements will be positioned in the order you declare
them in XAML. So the first element docks before the other elements and then the
second element docks and so on. Each element will wrap horizontally or
vertically based on its DockPanel.Dock attribute to fill any available space.
Elements that are docked to top or bottom will wrap horizontally (extend their
width) and elements that are docked to right or left will wrap vertically (extend
their height). If you do not provide a size for last element, it will wrap to
fill the space. This manner can create several combinations of layouts based
on the order of declarations and best way to learn them is to see some examples
and explain them.
Listing 5 and Figure 5 represent five TextBoxes that are
declared in a DockPanel. We will call these TextBoxes by their background
color names.
·
Coral TextBox, as the first declared element, docks to the top
then gets the default height, but wraps horizontally by extending its width to
fill all horizontal available space.
·
Plum, as the second element, docks to the bottom and fills all
available horizontal space just the same as Coral TextBox.
·
Aquamarine docks to the left and wants to extend its height to
fill all vertical space, but Coral and Plum TextBoxes have filled some space so
it tries to fill any remaining space.
·
Teal docks to the right similar to Aquamarine.
·
Finally, LawnGreen does not have a DockPanel.Dock attribute so it
fills all available space in DockPanel.
Listing 5
<Window x:Class="LayoutinXAML.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Layout in XAML" Height="150" Width="300"
>
<DockPanel>
<TextBox Background="Coral" DockPanel.Dock="Top">
ASP Alliance 1
</TextBox>
<TextBox Background="Plum" DockPanel.Dock="Bottom">
ASP Alliance 2
</TextBox>
<TextBox Background="Aquamarine" DockPanel.Dock="Left">
ASP Alliance 3
</TextBox>
<TextBox Background="Teal" DockPanel.Dock="Right">
ASP Alliance 4
</TextBox>
<TextBox Background="LawnGreen">
ASP Alliance 5
</TextBox>
</DockPanel>
</Window>
Figure 5
Now let us remove the last TextBox, LawnGreen, to see what
will happen for Listing 6 in Figure 6. Everything is the same as the previous
output except that Teal wraps to fill all available space and does not get the
default width.
Listing 6
<Window x:Class="LayoutinXAML.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Layout in XAML" Height="150" Width="300"
>
<DockPanel>
<TextBox Background="Coral" DockPanel.Dock="Top">
ASP Alliance 1
</TextBox>
<TextBox Background="Plum" DockPanel.Dock="Bottom">
ASP Alliance 2
</TextBox>
<TextBox Background="Aquamarine" DockPanel.Dock="Left">
ASP Alliance 3
</TextBox>
<TextBox Background="Teal" DockPanel.Dock="Right">
ASP Alliance 4
</TextBox>
</DockPanel>
</Window>
Figure 6
In Listing 7 I reorder elements in Listing 5 and put the Aquamarine
and Teal TextBoxes before Coral and Plum. The output is shown in Figure 7. As
Aquamarine is declared first, docks to left then wraps vertically; Teal does
the same on the right. Coral and Plum are declared after these two so you do
not have the same space as before to wrap horizontally.
Listing 7
<Window x:Class="LayoutinXAML.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Layout in XAML" Height="150" Width="300"
>
<DockPanel>
<TextBox Background="Aquamarine" DockPanel.Dock="Left">
ASP Alliance 3
</TextBox>
<TextBox Background="Teal" DockPanel.Dock="Right">
ASP Alliance 4
</TextBox>
<TextBox Background="Coral" DockPanel.Dock="Top">
ASP Alliance 1
</TextBox>
<TextBox Background="Plum" DockPanel.Dock="Bottom">
ASP Alliance 2
</TextBox>
<TextBox Background="LawnGreen">
ASP Alliance 5
</TextBox>
</DockPanel>
</Window>
Figure 7
Note that if you set the Width or Height of an element, it
will get these values and will not wrap horizontally or vertically, but other
elements cannot fill the remaining space.