Search code examples
wpfsilverlightxamlstackpanel

How do I space out the child elements of a StackPanel?


Given a StackPanel:

<StackPanel>
  <TextBox Height="30">Apple</TextBox>
  <TextBox Height="80">Banana</TextBox>
  <TextBox Height="120">Cherry</TextBox>
</StackPanel>

What's the best way to space out the child elements so that there are equally-sized gaps between them, even though the child elements themselves are of different sizes? Can it be done without setting properties on each of the individual children?


Solution

  • Use Margin or Padding, applied to the scope within the container:

    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="Margin" Value="0,10,0,0"/>
            </Style>
        </StackPanel.Resources> 
        <TextBox Text="Apple"/>
        <TextBox Text="Banana"/>
        <TextBox Text="Cherry"/>
    </StackPanel>
    

    EDIT: In case you would want to re-use the margin between two containers, you can convert the margin value to a resource in an outer scope, f.e.

    <Window.Resources>
        <Thickness x:Key="tbMargin">0,10,0,0</Thickness>
    </Window.Resources>
    

    and then refer to this value in the inner scope

    <StackPanel.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Margin" Value="{StaticResource tbMargin}"/>
        </Style>
    </StackPanel.Resources>