WPF -  Apresentando o controle Expander


 Hoje vamos apresentar o controle Expander da WPF e algumas de suas propriedades e recursos.

O Expander é um controle padrão de layout do WPF. O controle tem dois estados. No estado de retraído, que é o padrão, um pequeno cabeçalho e um botão são visíveis, mas o controle filho do Expander fica escondido.

Assim, o controle Expander pode ser visto com um controle GroupBox, mas, com uma característica adicional para expandir e retrair o seu conteúdo.

Quando o usuário clica no botão do Expander ele expande, a fim de mostrar o seu controle filho. Esse comportamento torna o controle útil para esconder informações que não são essenciais, permitindo a sua exibição somente a quem estiver interessado.

Vamos abrir o Visual Studio 2013 Express for windows desktop e criar uma aplicação WPF com o nome Wpf_Expander.

A seguir, a partir da ToolBox vamos selecionar o controle Expander e incluir no arquivo MainWindow.xaml:

Na figura acima vemos que o controle Expander possui um botão com uma seta. Quando a seta for clicada o elemento no interior do Expander será exibido ou escondido.

A seta expande o controle de forma que os sub controles existentes no seu interior serão visíveis.

Vamos então incluir um controle TextBlock no interior do Expander e definir algum texto conforme o código abaixo:

Executando o projeto teremos inicialmente o controle exibindo apenas o botão com a seta. Clicando na seta o conteúdo será exibido conforme a figura abaixo:

O controle Expander deriva de HeaderContentControl e possui uma propriedade Header para definir o conteúdo do cabeçalho e a propriedade Content para o conteúdo a ser expandido.

O controle também possui a propriedade boleana IsExpanded para definir e obter se o controle esta retraído ou expandido. Ela é True quando o controle está no seu estado expandido e False enquanto estiver retraído.

Você pode adicionar a propriedade no XAML, se você quiser que o controle seja expandido na primeira execução. Você também pode alterar a propriedade via código.

No modo retraído o controle usa somente o espaço necessário ao header. Já no modo expandido ele usa o tamanho do header e do Content juntos.

Além disso podemos definir outras propriedades para configurar o controle como :

No exemplo abaixo temos essas propriedades configuradas para o nosso exemplo:

Duas propriedades importantes do controle Expander são:

Vamos criar um exemplo mais prático usando os recursos do Expander.

Vamos incluir o código abaixo entre as tags <Grid> do arquivo MainWindow.xaml de forma a obter o seguinte resultado :

<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="286" Width="453">
    <Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label FontFamily="Wingdings" FontSize="40" Content="N"/>
            <Label Grid.Column="1"
               FontSize="15"
               FontWeight="Bold"
               VerticalAlignment="Center">A sua senha é inválida.</Label>
            <Expander Header="Mostrar mais informações..." Grid.Row="1" Grid.Column="1">
                <TextBlock Margin="24 6 0 0">
                As senhas devem seguir os seguintes critérios.<LineBreak/>
                1. O tamanho deve ser de 12 caracteres ou mais.<LineBreak/>
                2. Deve incluir letrar, números e símbolos.<LineBreak/>
                3. Deve incluir caracteres com caixa alta e caixa baixa.
                </TextBlock>
            </Expander>
        </Grid>
    </Grid>
</Window>

Executando a aplicação e clicando na seta do controle Expander iremos obter o seguinte :

Percebeu agora como podemos usar o controle Expander ?

Usando os eventos Expanded e Colapsed

Se você precisa detectar quando o usuário expande ou recolhe o controle Expander, e você estiver usando o modelo de evento em vez de databinding(ligação de dados), você pode usar os eventos Expanded e Collapsed.

Estes eventos são gerados quando o usuário interage com o controle. É possível determinar qual Expander foi utilizado porque uma referência para o controle é passado para o código do processador de eventos no parâmetro remetente.

Para usar estes eventos, modifique o XAML do exemplo acima para o Expander incluindo o código conforme o abaixo:

<Expander Header="Mostrar mais informações..." Grid.Row="1" Grid.Column="1" Expanded="Expandir" Collapsed="Retrair">

Com o código acima incluído no XAML, precisamos agora adicionar o código do evento.

Abra o arquivo MainWindow.xaml.vb e defina o código conforme abaixo:

Class MainWindow 
    Private Sub Expandir(sender As Object, e As RoutedEventArgs)
        DirectCast(sender, Expander).Header = "Mostrar menos informação..."
    End Sub
    Private Sub Retrair(sender As Object, e As RoutedEventArgs)
        DirectCast(sender, Expander).Header = "Mostrar mais informação...."
    End Sub
End Class

Este código esta alterando o valor da propriedade Header do Expander.

Executando a aplicação teremos no início o controle exibindo a seta para baixo e a mensagem "Mostrar mais informações...";

Clicando na seta teremos a exibição do conteúdo do Expander e da mensagem "Mostrar menos informações...":

Você pode definir os limite do controle Expander desenhando uma borda em torno do controle. O estilo para uma Expander já tem um elemento Border, embora não seja visível por padrão. Você pode torná-lo visível, definindo as propriedades BorderBrush e BorderThickness no Expander. Podemos também incluir imagens como conteúdo do Expander.

Inclua 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="350" Width="325">
    <Grid>
        <Expander BorderBrush="DarkGray" Margin="0,5">
            <Expander.Header>
                <Image Source="/Imagens/pizza3.jpg" Width="150" Height="100"/>
            </Expander.Header>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" Grid.Column="0" Content="Sabor" FontWeight="Bold"/>
                <Label Grid.Row="0" Grid.Column="1" Content="Pizza de Calabreza"/>
                <Label Grid.Row="1" Grid.Column="0" Content="Preço" FontWeight="Bold"/>
                <Label Grid.Row="1" Grid.Column="1" Content="R$ 35,00"/>
                <Label Grid.Row="2" Grid.Column="0" Content="Borda" FontWeight="Bold"/>
                <Label Grid.Row="2" Grid.Column="1" Content="Sim"/>
                <Label Grid.Row="3" Grid.Column="0" Content="Massa" FontWeight="Bold"/>
                <Label Grid.Row="3" Grid.Column="1" Content="Fina"/>
            </Grid>
        </Expander>
    </Grid>
</Window>

Executando o projeto teremos o seguinte resultado após clicar na seta para expandir o controle:



Pegue o projeto completo aqui:
Wpf_Expander.zip

Porque os judeus pedem sinal, e os gregos buscam sabedoria;
Mas nós pregamos a Cristo crucificado, que é escândalo para os judeus, e loucura para os gregos.
Mas para os que são chamados, tanto judeus como gregos, lhes pregamos a Cristo, poder de Deus, e sabedoria de Deus.
1 Coríntios 1:22-24

Referências:


José Carlos Macoratti