Added TipCalc Sample

This commit is contained in:
Javier Suárez Ruiz 2017-12-12 21:25:56 +01:00
parent 750adae87c
commit f1e203c325
8 changed files with 267 additions and 4 deletions

View File

@ -31,6 +31,7 @@ namespace Samples
new FilesSample ().Publish (); new FilesSample ().Publish ();
new DisplayAlertSample ().Publish (); new DisplayAlertSample ().Publish ();
new EditorSample().Publish(); new EditorSample().Publish();
new TipCalcSample().Publish();
new XuzzleSample().Publish(); new XuzzleSample().Publish();
UI.Present ("/display-alert"); UI.Present ("/display-alert");

View File

@ -38,6 +38,9 @@
<EmbeddedResource Update="DisplayAlertPage.xaml"> <EmbeddedResource Update="DisplayAlertPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="TipCalc\TipCalcPage.xaml">
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
<EmbeddedResource Update="XamlPreviewPage.xaml"> <EmbeddedResource Update="XamlPreviewPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
@ -46,10 +49,7 @@
<ItemGroup> <ItemGroup>
<None Remove="BugSweeper\Images\RedBug.png" /> <None Remove="BugSweeper\Images\RedBug.png" />
<None Remove="BugSweeper\Images\Xamarin120.png" /> <None Remove="BugSweeper\Images\Xamarin120.png" />
</ItemGroup> <None Remove="TipCalc\TipCalcPage.xaml" />
<ItemGroup>
<Folder Include="TipCalc\" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>

View File

@ -0,0 +1,33 @@
using System;
using System.Globalization;
using Xamarin.Forms;
namespace TipCalc
{
public class DoubleRoundingConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return Round((double)value, parameter);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return Round((double)value, parameter);
}
double Round(double number, object parameter)
{
double precision = 1;
// Assume parameter is string encoding precision.
if (parameter != null)
{
precision = Double.Parse((string)parameter);
}
return precision * Math.Round(number / precision);
}
}
}

View File

@ -0,0 +1,32 @@
using System;
using System.Globalization;
using Xamarin.Forms;
namespace TipCalc
{
public class DoubleToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
// Assumes value is double.
double number = (double)value;
// Return empty string for a zero (good for Entry views).
if (number == 0)
{
return "";
}
return number.ToString();
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
double number = 0;
Double.TryParse((string)value, out number);
return number;
}
}
}

View File

@ -0,0 +1,111 @@
using System;
using System.ComponentModel;
namespace TipCalc
{
class TipCalcModel : INotifyPropertyChanged
{
double subTotal, postTaxTotal, tipPercent, tipAmount, total;
public event PropertyChangedEventHandler PropertyChanged;
public double SubTotal
{
set
{
if (subTotal != value)
{
subTotal = value;
OnPropertyChanged("SubTotal");
Recalculate();
}
}
get
{
return subTotal;
}
}
public double PostTaxTotal
{
set
{
if (postTaxTotal != value)
{
postTaxTotal = value;
OnPropertyChanged("PostTaxTotal");
Recalculate();
}
}
get
{
return postTaxTotal;
}
}
public double TipPercent
{
set
{
if (tipPercent != value)
{
tipPercent = value;
OnPropertyChanged("TipPercent");
Recalculate();
}
}
get
{
return tipPercent;
}
}
public double TipAmount
{
set
{
if (tipAmount != value)
{
tipAmount = value;
OnPropertyChanged("TipAmount");
}
}
get
{
return tipAmount;
}
}
public double Total
{
set
{
if (total != value)
{
total = value;
OnPropertyChanged("Total");
}
}
get
{
return total;
}
}
void Recalculate()
{
this.TipAmount = Math.Round(this.TipPercent * this.SubTotal / 100, 2);
// Round total to nearest quarter.
this.Total = Math.Round(4 * (this.PostTaxTotal + this.TipAmount)) / 4;
}
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TipCalc"
x:Class="TipCalc.TipCalcPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="5, 20, 5, 0" />
<On Platform="Android, UWP, WinRT, WinPhone" Value="5, 0, 5, 0" />
</OnPlatform>
</ContentPage.Padding>
<ContentPage.Resources>
<ResourceDictionary>
<local:TipCalcModel x:Key="model" TipPercent="15" />
<local:DoubleToStringConverter x:Key="stringConverter" />
<local:DoubleRoundingConverter x:Key="roundConverter" />
</ResourceDictionary>
</ContentPage.Resources>
<Grid BindingContext="{StaticResource model}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Row 0 -->
<Label Text="Food &amp; Drink:" Grid.Row="0" Grid.Column="0" Font="Large" HorizontalTextAlignment="End" VerticalTextAlignment="Center" />
<Entry Grid.Row="0" Grid.Column="1" Keyboard="Numeric" Placeholder="Subtotal" Text="{Binding SubTotal, &#xA; Converter={StaticResource stringConverter}}" />
<!-- Row 1 -->
<Label Text="Total after Tax:" Grid.Row="1" Grid.Column="0" Font="Large" HorizontalTextAlignment="End" VerticalTextAlignment="Center" />
<Entry Grid.Row="1" Grid.Column="1" Keyboard="Numeric" Placeholder="Receipt total" Text="{Binding PostTaxTotal,&#xA; Converter={StaticResource stringConverter}}" />
<!-- Row 2 -->
<Label Text="Tip Percent:" Grid.Row="2" Grid.Column="0" Font="Large" HorizontalTextAlignment="End" VerticalTextAlignment="Center" />
<Entry Grid.Row="2" Grid.Column="1" Keyboard="Numeric" Text="{Binding TipPercent,&#xA; Converter={StaticResource stringConverter}}" />
<!-- Row 3 -->
<Slider Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Minimum="0" Maximum="100" Value="{Binding TipPercent,&#xA; Mode=TwoWay,&#xA; Converter={StaticResource roundConverter},&#xA; ConverterParameter=0.5}" />
<!-- Row 4 -->
<Label Text="Tip Amount:" Grid.Row="4" Grid.Column="0" Font="Large" HorizontalTextAlignment="End" VerticalTextAlignment="Center" />
<ContentView BackgroundColor="#40808080" Grid.Row="4" Grid.Column="1" Padding="10, 10, 40, 10">
<Label Text="{Binding TipAmount,&#xA; StringFormat='{0:C}'}" Font="Large" HorizontalTextAlignment="End" />
</ContentView>
<!-- Row 5 -->
<Label Text="Total:" Grid.Row="5" Grid.Column="0" Font="Large" HorizontalTextAlignment="End" VerticalTextAlignment="Center" />
<ContentView BackgroundColor="#40808080" Grid.Row="5" Grid.Column="1" Padding="10, 10, 40, 10">
<Label Text="{Binding Total, &#xA; StringFormat='{0:C}'}" Font="Large" HorizontalTextAlignment="End" />
</ContentView>
</Grid>
</ContentPage>

View File

@ -0,0 +1,10 @@
namespace TipCalc
{
public partial class TipCalcPage
{
public TipCalcPage()
{
InitializeComponent();
}
}
}

21
Samples/TipCalcSample.cs Normal file
View File

@ -0,0 +1,21 @@
using Ooui;
using Xamarin.Forms;
namespace Samples
{
public class TipCalcSample : ISample
{
public string Title => "Xamarin.Forms TipCalc";
public Ooui.Element CreateElement()
{
var page = new TipCalc.TipCalcPage();
return page.GetOouiElement();
}
public void Publish()
{
UI.Publish("/tipcalc", CreateElement);
}
}
}