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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Apresentando o WPF - Windows Presentation Foundation - Macoratti
WPF - Criando uma aplicação básica (para iniciantes) - Macoratti