Wahlin on .NET

Using the StackPanel Control

Dan walks through one of Silverlight's most flexible and easy to use layout controls.

In a previous article, I discussed layout controls available in Silverlight 2 that can be used to position shapes, buttons, textboxes and other controls on a user interface. Understanding how to use the different layout controls is key to being able to design flexible user interfaces that can easily adjust to different screen sizes without relying on exact x and y coordinate positioning.

In this article, I'll provide more details about the StackPanel control and show why it's one of the most flexible layout controls available in Silverlight.

Any time I learn a new technology, I try to make correlations between new controls and HTML or ASP.NET elements/controls that I already know well since it simplifies the learning process. The StackPanel control doesn't directly correlate with any of the container controls available in HTML (although multiple div tags combined with CSS can provide similar functionality), but it's similar to the ASP.NET DataList control in some ways. With the DataList, you can display a list of items vertically or horizontally by changing the RepeatDirection property. Although the StackPanel control doesn't have a RepeatDirection property, it does provide an Orientation property that performs the same overall purpose. By changing the Orientation to Horizontal (Vertical is the default), child controls contained within a StackPanel control will automatically be arranged horizontally. Spacing between controls can be controlled by setting each control's Margin property.

It's important to note that if the child controls don't fit in the parent StackPanel control and flow outside of the container's boundaries, they'll be chopped off in the interface. Unfortunately, th StackPanel control doesn't automatically wrap controls like the ASP.NET DataList. If you need to wrap child controls that flow outside of the container's boundaries,you can use one of several WrapPanel controls for Silverlight that have been built by different developers. One of the custom WrapPanel controls that I've used can be found here.

The StackPanel control is simple to use and provides the ultimate flexibility when it comes to arranging controls because it doesn't worry at all about absolute positioning. Since it doesn't worry about x or y coordinates, it provides one of the best solutions for situations where users can switch to full-screen mode or change the overall size of the user interface. Here's an example of using the StackPanel to organize several buttons horizontally:

<StackPanel x:Name="spButtons" Orientation="Horizontal" 
  Background="LightGray" Height="100" Width="400"
    Margin="10" >
    <Button x:Name="btn3" Content="Button 3" 
       Height="20" Margin="10" />
    <Button x:Name="btn4" Content="Button 4" 
       Height="20" Margin="10" />
    <Button x:Name="btn5" Content="Button 5"  
       Height="20" Margin="10" />
    <Button x:Name="btn6" Content="Button 6"  
       Height="20" Margin="10" />
    <Button x:Name="btn7" Content="Button 7"  
       Height="20" Margin="10" />
    <!--
        Won't wrap properly since it flows 
           outside of the container
        <Button x:Name="btn8" Content="Button 8" 
           Height="30" Margin="10" />
    -->
</StackPanel>

This example gives the StackPanel control a name of spButtons, sets the Orientation to Horizontal and Background to LightGray. The container's dimensions are set to 400 for the Width and by 100 for the Height. Omitting the Height and Width properties would allow the control to fill its parent container. Each Button within the StackPanel parent container has a Margin of 10 to space the controls equally in the container. Looking through the code, you'll notice that the Button named btn8 is commented out since it would flow outside of the StackPanel control's boundaries and be chopped off in the user interface. Figure 1 shows an example of what the StackPanel looks like when rendered by Silverlight.

StackPanel controls can be nested inside of each other to create extremely flexible layouts quickly and easily without worrying about child control positioning. The following code shows how two StackPanel controls can be nested in a parent StackPanel. The parent StackPanel stacks the child StackPanel controls vertically (which is the default so the Orientation property could be omitted in this example). Each of the nested StackPanel controls stacks their content horizontally.

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <Button x:Name="btnShrink" Content="Shrink" 
          Height="20" 
          Margin="10" Click="btnShrink_Click" />
        <Button x:Name="btnGrow" Content="Grow"
          Height="20"  
          Margin="10" Click="btnGrow_Click" />
    </StackPanel>
    <StackPanel x:Name="spButtons" Orientation="Horizontal" 
      Background="LightGray" Height="100" Width="400" 
         Margin="10" >
        <Button x:Name="btn3" Content="Button 3" Height="20" 
          Margin="10" />
        <Button x:Name="btn4" Content="Button 4" Height="20" 
          Margin="10" />
        <Button x:Name="btn5" Content="Button 5" Height="20" 
          Margin="10" />
        <Button x:Name="btn6" Content="Button 6" Height="20" 
          Margin="10" />
        <Button x:Name="btn7" Content="Button 7" Height="20" 
          Margin="10" />
        <!--
            Won't wrap properly
            <Button x:Name="btn8" Content="Button 8" 
          Height="30"  Margin="10" />
        -->
    </StackPanel>
</StackPanel>

The output generated by the StackPanel controls is shown in Figure 2.

The StackPanel can also be used with other Silverlight controls such as Grid and Canvas as needed.

In the next article I'll discuss how StackPanel containers can be animated to create clipping effects quickly with a minimal amount of coding on your part.

About the Author

Dan Wahlin (Microsoft MVP for ASP.NET and XML Web Services) is the founder of The Wahlin Group which specializes in .NET and SharePoint onsite, online and video training and consulting solutions. Dan also founded the XML for ASP.NET Developers Web site, which focuses on using ASP.NET, XML, AJAX, Silverlight and Web Services in Microsoft's .NET platform. He's also on the INETA Speaker's Bureau and speaks at conferences and user groups around the world. Dan has written several books on .NET including "Professional Silverlight 2 for ASP.NET Developers," "Professional ASP.NET 3.5 AJAX, ASP.NET 2.0 MVP Hacks and Tips," and "XML for ASP.NET Developers." Read Dan's blog here.

comments powered by Disqus

Featured

  • .NET 11 Preview 5 Focuses on Performance, Productivity and Safer Code

    .NET 11 Preview 5 focuses on under-the-hood runtime performance gains, streamlined APIs and language features that reduce boilerplate, plus built‑in security checks and incremental ASP.NET Core and EF Core improvements aimed at everyday developer productivity.

  • VS Code 1.124 Focuses on Agent Autonomy and Parallel Sessions

    Microsoft's June 2026 VS Code update turns on Autopilot by default and adds background sending for agent sessions.

  • Developing Agentic Systems in .NET: From Concept to Code

    ZioNet founder Alon Fliess previews his Visual Studio Live! San Diego session on building true agentic systems in .NET -- covering the cognitive loop, MCP tool integration, multi-agent orchestration and enterprise hosting and governance with the Microsoft Agent Framework.

  • Mastering AI Development and Building AI Apps with GitHub Copilot

    Two Microsoft experts explain how GitHub Copilot is evolving from a coding assistant into a broader platform for building, customizing and testing AI-powered developer workflows.

Subscribe on YouTube