Carlos Mattos

WPF - Botões com Imagens Alternadas para Ativado, Pressionado e Desativado

Um dos controles mais utilizados em todas as aplicações é o Botão (Button). E a cada novo projeto tentamos mudar sua aparência para melhorar a experiência visual do usuário e tornar nossa interface mais funcional. Uma prática muito comum é o uso de imagens nos botões, as imagens auxiliam o usuário a interpretar o comando associado ao botão. Nas aplicações WPF existem diferentes formas de implementar botões com imagens e comportamentos das mais diversas formas e variações. O propósito deste artigo é demonstrar como criar um botão com imagens que se alternam de acordo com o estado do botão (ativado, pressionado ou desativado). O exemplo que utilizei para ilustrar este artigo é simples e de fácil implementação. As imagens a seguir apresentam o botão em tempo de execução nos seus diferentes status.

Figura 1: O botão com imagem (ativado)

Figura 2: O botão com imagem (desativado)

 Figura 3: O botão com imagem (pressionado)

 

Construindo o exemplo

Utilizaremos dois projetos para ilustrar este exemplo. O primeiro projeto deve ser criado com o template WPF Application e será a aplicação de teste para o nosso botão com imagem. O segundo projeto deve ser criado com o template User Control Library, este projeto implementará nosso SampleImageButton. A Figura 4 mostra a janela Solution Explorer com a Solução de exemplo.

Figura 4: O projeto de exemplo

 

Criando o Botão de Exemplo

Adicione ao projeto User Control Library as imagens que você deseja usar no seu botão customizado. No meu caso eu coloquei três imagens de um cubo. O cubo cinza será exibido quando o botão estiver desabilitado, a imagem vermelha quando o botão estiver pressionado e o cubo amarelo quando o botão estiver em seu estado normal. O Quadro 1 apresenta o código XAML necessário para implementar a classe MyImageButton.

 

<!--As propriedades Width, Height, MaxHeight, MaxWidth, MinWidth podem ser usadas

para definir o tamanho padrão do controle. Assim quando o developer arrastar

o controle a partir da ToolBox, ele será criado com seu tamanho padrão-->

<Button x:Class="ExemploWPFImageButton.MyImageButton" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="120" Height="90" MaxHeight="90" MaxWidth="120" MinHeight="90" MinWidth="120">

<Button.Template>

    <!--O ControlTemplate define o tipo de controle que será construido-->

    <ControlTemplate TargetType="{x:Type Button}">

        <!--Dois containers StackPanel e Grid acomodarão as imagens e o texto do botão-->

        <StackPanel Background="#FF232222" Width="120" Height="90">

            <Grid Margin="0,10,0,0">

                <!--As imagens que indicam os estados Pressionado e Desativado ficarão ocultas-->

                <!--A propriedade Visibility="Hidden" se encarrega desta tarefa-->

                <Image Name="Normal" Source="Images/cubeYellow.png" Height="48" Width="48"/>

                <Image Name="Pressed" Source="Images/cubeRed.png" Visibility="Hidden" Height="48" Width="48"/>

                <Image Name="Disabled" Source="Images/cubeGray.png" Visibility="Hidden" Height="48" Width="48"/>

            </Grid>

            <TextBlock TextAlignment="Center" FontWeight="Bold" Margin="10"

                        Foreground="WhiteSmoke">Clique no Cubo</TextBlock>

        </StackPanel>

        <!--Aqui está o responsável pela troca de imagens de acordo com o estado do botão-->

        <!--Os Triggers podem ser usados para diversas aplicações, este é um bom exemplo-->

        <ControlTemplate.Triggers>

            <!--O primeiro Trigger avalia a propriedade IsPressed-->

            <Trigger Property="IsPressed" Value="True">

                <!--O elemento Setter através do atributo TargetName estabelece o vínculo com a imagem-->

                <!--e o atributo Property indica a Propriedade, Value atribui o valor desejado-->

                <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/>

                <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/>

            </Trigger>

                <!--O mesmo conceito é aplicado para avaliar a propriedade IsEnabled-->

            <Trigger Property="IsEnabled" Value="False">

                <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/>

                <Setter TargetName="Disabled" Property="Visibility" Value="Visible"/>

            </Trigger>

        </ControlTemplate.Triggers>

    </ControlTemplate>

</Button.Template>

</Button>

Quadro 1: Código XAML do controle MyImageButton

 

O Quadro 2 apresenta o código do arquivo MyImageButton.cs.

 

using System.Windows.Controls;

 

namespace ExemploWPFImageButton

{

    /// <summary>

    /// Interaction logic for MyImageButton.xaml

    /// </summary>

    public partial class MyImageButton : Button

    {

        public MyImageButton()

        {

            InitializeComponent();

        }

    }

}

Quadro 2: Código do arquivo MyImageButton.cs

 

Por último, vamos adicionar o botão na Janela MainWindow do projeto de exemplo. Observe o código XAML no Quadro 3.

 

<Window x:Class="ExemploWPFImageButton.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="DevBrasil | WPF | Image Button" Height="319" Width="351"

        xmlns:my="clr-namespace:ExemploWPFImageButton"

        xmlns:my1="clr-namespace:ExemploWPFImageButton;assembly=SampleImageButton">

<Grid Language="pt-BR" Background="#FF141212">

        <Button Content="Ativar/Desativar" Height="30" HorizontalAlignment="Left" Margin="103,198,0,0" Name="button1" VerticalAlignment="Top" Width="120" Click="button1_Click" />

        <my1:MyImageButton Content="Button" Height="23" HorizontalAlignment="Left" Margin="103,82,0,0" Name="myImageButton1" VerticalAlignment="Top" Width="75" />

    </Grid>

</Window>

Quadro 3: A janela MainWindow

 

 

Agora é só executar seu projeto de exemplo e observar o comportamento do botão em seus três estados diferentes. Existem diversas técnicas para criar controles customizados, este é um exemplo prático para customizar seus botões. Você pode empregar esta técnica para criar uma biblioteca de botões padronizados para sua aplicação.

 

Aprofunde seus conhecimentos sobre este tema visitando a comunidade WPF.

Faça download deste arquivo no formato PDF e também do código-fonte deste exemplo.

 

 

 

Posted: Sat, Mar 19 2011 16:43 by Carlos Mattos | with no comments
Filed under: ,
Leave a Comment

(required) 

(required) 

(optional)
 

(required) 

If you can't read this number refresh your screen
Enter the numbers above: