Desenvolvimento

22 out, 2014

WPF – Apresentando o StackPanel

Publicidade

Hoje vamos falar um pouco sobre os conceitos básicos do WPF – Windows Presentation Foundation, relacionados com o gerenciamento de leiaute usando o Editor do WPF com o foco na classe StackPanel.

Quando você cria uma aplicação WPF, você tem a sua disposição um editor WPF com uma visão conforme exibida na figura abaixo:

wpf_stck12

Nota: Estou usando o Visual Studio 2013 Express for windows desktop.

Nesta figura observamos:

  • O editor no modo Design exibindo a janela (MainWindow.xaml) WPF;
  • O editor XAML exibindo o código usado;
  • A janela Solution Explorer (Gerenciador de Soluções);
  • A janela de Propriedades;
  • A ToolBox exibindo os controles WPF

“O Windows Presentation Foundation (ou WPF), inicialmente chamado de Avalon, é um subsistema gráfico disponível a partir do .NET Framework 3.0 (inicialmente chamado de WinFX), que usa uma linguagem de marcação, conhecida como XAML para desenvolvimento de Interfaces ricas. O WPF está incluído com o Windows Vista e Windows Server 2008, e também está disponível para Windows XP Service Pack 2 e mais recentes, e Windows Server 2003.

Este oferece um modelo consistente de programação para construir aplicações e uma clara separação entre interface com o usuário e lógica de negócios. Uma aplicação WPF pode ser implantada em ambiente Desktop ou hospedada em um site da web.

Se propõem a unificar um número de serviços de aplicações: interface com o usuário, desenhos 2D e 3D, documentos fixos e adaptáveis, tipografia avançada, gráficos vetoriais, gráficos Raster, animações, vinculação de dados, áudio e vídeo”. Fonte: http://pt.wikipedia.org/wiki/Windows_Presentation_Foundation

Todos os containers de layout WPF são panels que derivam da classe abstrata System.Windows.Controls.Panel, conforme mostra a figura abaixo:

wpf_stckx

Apresentando o StackPanel

O StackPanel é um dos painéis mais populares da WPF devido à sua simplicidade e sua utilidade. Ele arranja os elementos filhos em uma pilha vertical ou horizontal, dependendo da orientação, sendo usado para seções menores de uma janela mais complexa. Isto é muito útil para criar qualquer tipo de listas.

Todos os controles ItemsControls WPF como ComboBox, ListBox ou Menu usam um StackPanel como seu painel de layout interno.

Podemos controlar a posição dos elementos usando HorizontalAlignment ou VerticalAlignment e controlar o espaçamento usando propriedades margin e padding.

Para arranjar os elementos na horizontal, basta definir a sua propriedade Orientation da seguinte forma: <StackPanel Orientation=”Horizontal”>. O StackPanel é uma boa indicação quando você precisa exibir uma lista de elementos e pode ser usado internamente como leiaute padrão para outros controles WPF como o Listbox.

Vamos criar vários leiautes em uma aplicação WPF usando o StackPanel para vermos suas possibilidades.

Criando o projeto no Visual Studio 2013

Abra o Visual Studio 2013 e clique em New Project. Selecione a linguagem Visual Basic ou C# e o template WPF Application informando o nome Wpf_StackPanel.

wpf_stck11

Exemplo 1.  Criando um leiaute simples com StackPanel

Neste exemplo, incluímos a partir da ToolBox um controle TextBlock e 5 controles Buttons em um painel StackPanel.

Você pode notar que o StackPanel arranja os elementos filhos de cima para baixo na orientação vertical.

Todos os elementos no interior do StackPanel são ajustados para a largura do controle.

wpf_stck14

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="TextBlock - Macoratti.Net"></TextBlock>
            <Button Content="Button 1"></Button>
            <Button Content="Button 2"></Button>
            <Button Content="Button 3"></Button>
            <Button Content="Button 4"></Button>
            <Button Content="Button 5"></Button>
        </StackPanel>
    </Grid>
</Window>

Exemplo 2. Mudando a orientação para Horizontal

Neste exemplo arranjamos os elementos filhos no StackPanel horizontalmente definindo o valor  propriedade Orientation como Horizontal.

wpf_stck15

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="TextBlock - Macoratti.Net"></TextBlock>
            <Button Content="Button 1"></Button>
            <Button Content="Button 2"></Button>
            <Button Content="Button 3"></Button>
            <Button Content="Button 4"></Button>
            <Button Content="Button 5"></Button>
        </StackPanel>
    </Grid>
</Window>

Exemplo 3. Alterando a propriedade FlowDirection

Definindo o valor da propriedade FlowDirection para RightToLeft, o empilhamento dos elementos filhos começa da direita para a esquerda. O padrão é LeftToRight.

wpf_stck16

<Window x:Class="MainWindow"   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"              
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Orientation="Horizontal" FlowDirection="RightToLeft">
            <TextBlock Text="TextBlock - Macoratti.Net"></TextBlock>
            <Button Content="Button 1"></Button>
            <Button Content="Button 2"></Button>
            <Button Content="Button 3"></Button>
            <Button Content="Button 4"></Button>
            <Button Content="Button 5"></Button>
        </StackPanel>
    </Grid>
</Window>

Exemplo 4. Alterando a propriedade HorizontalAlignment dos elementos filhos

Por padrão, a propriedade HorizontalAlignment é definida com o valor Stretch para todos os elementos filhos. Por isso eles são esticados para a largura do StackPanel.

Podemos alterar o valor desta propriedade para Right, Left, Center ou Stretch.

wpf_stck17

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="TextBlock - Macoratti.Net"></TextBlock>
              <Button Content="Button 1" HorizontalAlignment="Right"></Button>
            <Button Content="Button 2" HorizontalAlignment="Left"></Button>
            <Button Content="Button 3" HorizontalAlignment="Center"></Button>
            <Button Content="Button 4" HorizontalAlignment="Stretch"></Button>
              <Button Content="Button 5"></Button>
        </StackPanel>
    </Grid>
</Window>

Exemplo 5. Alterando a propriedade VerticalAlignment dos elementos filhos

Com a propriedade Orientation definida como Horizontal podemos alterar o valor da propriedade VerticalAlignment dos elementos filhos para os valores Bottom, Top, Center e Stretch.

wpf_stck18

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="TextBlock - Macoratti.Net"></TextBlock>
            <Button Content="Button 1" VerticalAlignment="Bottom"></Button>
            <Button Content="Button 2" VerticalAlignment="Top"></Button>
            <Button Content="Button 3" VerticalAlignment="Center"></Button>
            <Button Content="Button 4" VerticalAlignment="Stretch"></Button>
            <Button Content="Button 5"></Button>
        </StackPanel>
    </Grid>
</Window>

Exemplo 6. Ajustando a propriedade Margin do StackPanel

Podemos usar a propriedade Margin do StackPanel para definir o espaço entre as margens do StackPanel e a janela Container.

No exemplo a seguir, definimos o valor da propriedade Margin com o valor de 50 e definindo a propriedade BackGround do TextBlock como igual a Yellow.

Podemos definir várias margens para cada lado (Margin=”left,top,right,bottom”).

wpf_stck19

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Margin="50">
            <TextBlock Text="TextBlock - Macoratti.Net" Background="Yellow"></TextBlock>
            <Button Content="Button 1" VerticalAlignment="Bottom"></Button>
            <Button Content="Button 2" VerticalAlignment="Top"></Button>
            <Button Content="Button 3" VerticalAlignment="Center"></Button>
            <Button Content="Button 4" VerticalAlignment="Stretch"></Button>
            <Button Content="Button 5"></Button>
        </StackPanel>
    </Grid>
</Window>

Exemplo 7. Aninhando StackPanels

Podemos aninhar um StackPanel no interior de outro painel StackPanel. Neste exemplo, temos um leiaute onde o primeiro StackPanel possui orientação vertical (Orientation=”Vertical”), que é o valor padrão.

No interior deste StackPanel temos outro StackPanel, onde definimos uma orientação horizontal ( Orientation=”Horizontal” ) com a propriedade HorizontalAlignmentdefinida com o valor Center.

Incluímos também controles RadioButton para obter o leiaute abaixo:

wpf_stck1a

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Margin="30">
            <TextBlock Text="Selecione a sua linguagem de programação favorita" FontSize="16" 
Background="BlanchedAlmond"></TextBlock>
            <RadioButton Margin="10,10,0,0" FontSize="18">C#</RadioButton>
            <RadioButton Margin="10,10,0,0" FontSize="18">Java</RadioButton>
            <RadioButton Margin="10,10,0,0" FontSize="18">VB .NET</RadioButton>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <Button Content="Votar" Margin="5" MinWidth="80" FontSize="16"></Button>
                <Button Content="Sair" Margin="5" MinWidth="80" FontSize="16"></Button>
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

Para concluir, vamos mostrar mais dois exemplos de aplicações WPF usando o StackPanel.

Crie um novo projeto no Visual Studio 2013 Express for Windows desktop do tipo WPF Application com o nome Wpf_StackPanel;

A seguir digite o código abaixo no arquivo MaindWindow.xaml:

wpf_stck1b

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="340" Width="520">
    <Grid>
        <Canvas >
            <Ellipse Width="100" Height="100" Fill="Red" />
            <Ellipse Width="180" Height="180" Fill="Orange" />
            <Ellipse Width="160" Height="160" Fill="Yellow" />
            <Ellipse Width="140" Height="140" Fill="Green" />
            <Ellipse Width="120" Height="120" Fill="Blue" />
        </Canvas>
    </Grid>
</Window>

Agora, para alterar a disposição das elipses geradas, vamos incluir um StackPanel definindo sua orientação como Horizontal, conforme o código a seguir:

wpf_stck1c

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="340" Width="520">
    <Grid>
        <Canvas >
            <StackPanel Orientation="Horizontal">
            <Ellipse Width="100" Height="100" Fill="Red" />
            <Ellipse Width="80" Height="80" Fill="Orange" />
            <Ellipse Width="60" Height="60" Fill="Yellow" />
            <Ellipse Width="40" Height="40" Fill="Green" />
            <Ellipse Width="20" Height="20" Fill="Blue" />
            </StackPanel>
        </Canvas>
    </Grid>
</Window>

E finalmente vamos mostrar como preencher toda a janela MainWindow com o controle StackPanel e definir uma cor de fundo.

Digite o código abaixo no arquivo MainWindow.xaml:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="340" Width="520">
    <Grid>
        <StackPanel Margin="0,0,0,0" VerticalAlignment="Stretch"   
            HorizontalAlignment="Stretch"   
            Width="Auto" Height="Auto"  
            Background="BlanchedAlmond"/>
    </Grid>
</Window>

O resultado pode ser visto na figura a seguir:

wpf_stck1d

Pegue o projeto completo aqui: Wpf_StackPanel.zip