WPF - Calculando Pagamentos (C#)


Neste artigo vou apresentar uma pequena aplicação WPF que faz o cálculo de pagamentos usando a linguagem C#.

Nosso objetivo neste artigo é mostrar como trabalhar como o controle ListView da WPF.

O código XAML do programa usa linhas e colunas de grade junto com rótulos, caixas de texto, botões e outros controles. Tudo isso de forma bem simples.

O código C# do arquivo code-behind também é simples e forma que você vai entender facilmente o exemplo.

Abaixo temos a aplicação em execução:

Recursos usados:

Criando o projeto WPF no Visual Studio Community

Abra o VS Community 2017 e crie um novo projeto do tipo WPF App (.NET Framework) com o nome Wpf_CalcPagamentos :

A seguir vamos criar uma pasta Model no projeto e incluir nesta pasta a classe Amortizacao com o código abaixo:

 public class Amortizacao
 {
        public string Periodo { get; set; }
        public string Pagamento { get; set; }
        public string Juros { get; set; }
        public string Saldo { get; set; }
 }

Essa classe representa o nosso modelo de domínio para realizar pagamentos.

A seguir abra o arquivo MainWindow.xaml e inclua o código abaixo neste arquivo:

 <Window x:Class="Wpf_CalcPagamentos.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Wpf_CalcPagamentos"
        mc:Ignorable="d"
        Title="Calcula Pagamentos" Height="500" Width="500">
    <Grid Margin="2">
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.Resources>
            <Style TargetType="TextBox">
                <Setter Property="Width" Value="70"/>
                <Setter Property="Margin" Value="2"/>
            </Style>
            <Style TargetType="Label">
                <Setter Property="Height" Value="28"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
            </Style>
        </Grid.Resources>
        <Label Grid.Row="0" Grid.Column="0" Content="Saldo Inicial:"/>
        <TextBox Grid.Row="0" Grid.Column="1" Name="txtSaldoInicial"
            Text="5.000,00" HorizontalContentAlignment="Right"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Taxa Juros:"/>
        <TextBox Grid.Row="1" Grid.Column="1" Name="txtTaxaJuros"
            Text="5" HorizontalContentAlignment="Right"/>
        <Label Grid.Row="2" Grid.Column="0" Content="Pagamento %:"/>
        <TextBox Grid.Row="2" Grid.Column="1" Name="txtPercentualPagamento"
            Text="6" HorizontalContentAlignment="Right"/>
        <Label Grid.Row="3" Grid.Column="0" Content="Pgto Mínimo:"/>
        <TextBox Grid.Row="3" Grid.Column="1" Name="txtPagamentoMinimo"
            Text="120,00" HorizontalContentAlignment="Right"/>
        <Button Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2"
            Content="Calcular" Width="75" Height="30" Name="btnCalcula" Click="btnCalcula_Click" />
        <ListView Grid.Row="0" Grid.Column="2" Grid.RowSpan="6" Name="lvwPagamentos">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Período" Width="50"
                        DisplayMemberBinding="{Binding Path=Periodo}"/>
                    <GridViewColumn Header="Pagamento" Width="75">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Pagamento}"
                                    TextAlignment="Right"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Juro" Width="75">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Juros}"
                                    TextAlignment="Right"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Saldo" Width="75">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Saldo}"
                                    TextAlignment="Right"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        <StackPanel Grid.Row="7" Grid.Column="2" Orientation="Horizontal"
            HorizontalAlignment="Center" Margin="2">
            <Label Content="Total Pagamentos:"/>
            <Label Width="75" Background="Aqua" Name="lblTotalPagamentos" 
                   HorizontalContentAlignment="Right"/>
        </StackPanel>
    </Grid>
</Window>

No código acima o ListView contém um controle GridView que fornece as linhas e colunas. O GridView contém objetos GridViewColumn para definir suas colunas.

Por padrão, os contâineres de itens dentro do GridView que exibem os dados não ampliam seu conteúdo para preencher a área disponível.

A propriedade ListView.View indica como os itens são exibidos pelo controle. Este exemplo usa um controle Grid. Esse controle contém uma coleção de objetos GridViewColumn que definem as colunas dos dados.

O primeiro GridViewColumn exibe o período de pagamento. Sua propriedade DisplayBindingMember indica qual parte dos dados da associação de dados do controle que esta coluna deve exibir. Esta coluna exibe a propriedade Período do objeto de dados.

O segundo GridViewColumn exibe o valor do pagamento. Ele usa um CellTemplate para definir como seus dados devem ser exibidos.

Nota: O GridViewColumn não deve ter um valor de DisplayBindingMember definido ou ignorará seu CellTemplate.

O CellTemplate da coluna de pagamento informa ao controle para exibir seus dados em um TextBlock. Esse controle deve definir sua propriedade Text para o valor de ligação de dados Pagamento e deve alinhar seu texto à direita.

O restante das colunas do controle ListView é definido de maneira semelhante.

O leiaute gerado pelo código acima pode ser visto abaixo:



Vamos agora dar vída a nossa aplicação definindo o código C# no arquivo code-behind MainWindow.xaml.cs mostrado a seguir:

using System.Globalization;
using System.Windows;
using Wpf_CalcPagamentos.Model;
namespace Wpf_CalcPagamentos
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void btnCalcula_Click(object sender, RoutedEventArgs e)
        {
            // Obtém os dados dos parâmetros.
            decimal saldo = decimal.Parse(txtSaldoInicial.Text, NumberStyles.Any);
            decimal taxa_juros = decimal.Parse(txtTaxaJuros.Text.Replace("%", "")) / 100;
            decimal pagamento_percentual = decimal.Parse(txtPercentualPagamento.Text.Replace("%", "")) / 100;
            decimal pagamento_minimo = decimal.Parse(txtPagamentoMinimo.Text, NumberStyles.Any);
            taxa_juros /= 12;
            lblTotalPagamentos.Content = null;
            decimal total_pagamentos = 0;
            // Exibe o saldo inicial
            lvwPagamentos.Items.Clear();
            Amortizacao data = new Amortizacao()
            {
                Periodo = "0",
                Pagamento = null,
                Juros = null,
                Saldo = saldo.ToString("c"),
            };
            lvwPagamentos.Items.Add(data);
            // Percorre ate o que o saldo seja zero (saldo == 0.)
            for (int i = 1; saldo > 0; i++)
            {
                // Calcula o Pagamento
                decimal pagamento = saldo * pagamento_percentual;
                if (pagamento < pagamento_minimo) pagamento = pagamento_minimo;
                // Calcula o juros
                decimal juro = saldo * taxa_juros;
                saldo += juro;
                // Verifica se podemos liquidar o saldo
                if (pagamento > saldo) pagamento = saldo;
                total_pagamentos += pagamento;
                saldo -= pagamento;
                // Exibe os resultados
                data = new Amortizacao()
                {
                    Periodo = i.ToString(),
                    Pagamento = pagamento.ToString("c"),
                    Juros = juro.ToString("c"),
                    Saldo = saldo.ToString("c"),
                };
                lvwPagamentos.Items.Add(data);
            }
            // Exibe o pagamento total
            lblTotalPagamentos.Content = total_pagamentos.ToString("c");
        }
    }
}

O código C# aqui faz o cálculo do pagamento com base nos valores da taxa de juros, valor mínimo e do percentual de pagamento mínimo.

As vinculações no interior do ListView e seus objetos usam os nomes das propriedades da classe Amortizacao para determinar quais valores serão exibidos.

Executando o projeto para um conjunto de dados iremos obter o seguinte resultado:

Simples assim...

Os dados não estão sendo persistidos. Que tal implementar esse recurso ??

Pegue o codigo completo do projeto aqui:  Wpf_CalcPagamentos.zip

Aguarde novos artigos sobre WPF.

"Jesus respondeu, e disse-lhe: Se alguém me ama, guardará a minha palavra, e meu Pai o amará, e viremos para ele, e faremos nele morada."
João 14:23

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti