diff --git a/TipCalc/TipCalc.sln b/TipCalc/TipCalc.sln
new file mode 100644
index 0000000..7282709
--- /dev/null
+++ b/TipCalc/TipCalc.sln
@@ -0,0 +1,35 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31220.234
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TipCalc", "TipCalc\TipCalc\TipCalc.csproj", "{F06E1181-6049-43CA-B314-F42A3292ABBD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TipCalc.WinUI", "TipCalc\TipCalc.WinUI\TipCalc.WinUI.csproj", "{252AD965-64C4-4852-95F7-9D378231998E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F06E1181-6049-43CA-B314-F42A3292ABBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F06E1181-6049-43CA-B314-F42A3292ABBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F06E1181-6049-43CA-B314-F42A3292ABBD}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {F06E1181-6049-43CA-B314-F42A3292ABBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F06E1181-6049-43CA-B314-F42A3292ABBD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F06E1181-6049-43CA-B314-F42A3292ABBD}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {252AD965-64C4-4852-95F7-9D378231998E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {252AD965-64C4-4852-95F7-9D378231998E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {252AD965-64C4-4852-95F7-9D378231998E}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {252AD965-64C4-4852-95F7-9D378231998E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {252AD965-64C4-4852-95F7-9D378231998E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {252AD965-64C4-4852-95F7-9D378231998E}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
+ EndGlobalSection
+EndGlobal
diff --git a/TipCalc/TipCalc/Directory.Build.targets b/TipCalc/TipCalc/Directory.Build.targets
new file mode 100644
index 0000000..b5eda5f
--- /dev/null
+++ b/TipCalc/TipCalc/Directory.Build.targets
@@ -0,0 +1,26 @@
+
+
+
+
+ <_KeepLaunchProfiles>true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/App.xaml b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/App.xaml
new file mode 100644
index 0000000..49f4667
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/App.xaml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/App.xaml.cs b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/App.xaml.cs
new file mode 100644
index 0000000..9477522
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/App.xaml.cs
@@ -0,0 +1,33 @@
+using Microsoft.Maui;
+using Microsoft.UI.Xaml;
+using Windows.ApplicationModel;
+
+// To learn more about WinUI, the WinUI project structure,
+// and more about our project templates, see: http://aka.ms/winui-project-info.
+
+namespace TipCalc.WinUI
+{
+ ///
+ /// Provides application-specific behavior to supplement the default Application class.
+ ///
+ public partial class App : MauiWinUIApplication
+ {
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected override IStartup OnCreateStartup() => new Startup();
+
+ protected override void OnLaunched(LaunchActivatedEventArgs args)
+ {
+ base.OnLaunched(args);
+
+ Microsoft.Maui.Essentials.Platform.OnLaunched(args);
+ }
+ }
+}
diff --git a/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/Package.appxmanifest b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/Package.appxmanifest
new file mode 100644
index 0000000..bc2f925
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/Package.appxmanifest
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+ TipCalc
+ Microsoft
+ Assets\appiconStoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/app.manifest b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/app.manifest
new file mode 100644
index 0000000..ed152c2
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc.WinUI/Platforms/Windows/app.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc.WinUI/Properties/launchSettings.json b/TipCalc/TipCalc/TipCalc.WinUI/Properties/launchSettings.json
new file mode 100644
index 0000000..68fea2a
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc.WinUI/Properties/launchSettings.json
@@ -0,0 +1,7 @@
+{
+ "profiles": {
+ "TipCalc.WinUI": {
+ "commandName": "MsixPackage"
+ }
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc.WinUI/TipCalc.WinUI.csproj b/TipCalc/TipCalc/TipCalc.WinUI/TipCalc.WinUI.csproj
new file mode 100644
index 0000000..29961b3
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc.WinUI/TipCalc.WinUI.csproj
@@ -0,0 +1,61 @@
+
+
+
+ net6.0-windows10.0.19041
+ win-x64
+ WinExe
+ 10.0.17763.0
+ true
+ true
+ TipCalc
+
+
+ true
+ MSIX
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc/App.xaml b/TipCalc/TipCalc/TipCalc/App.xaml
new file mode 100644
index 0000000..85185cc
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/App.xaml
@@ -0,0 +1,7 @@
+
+
diff --git a/TipCalc/TipCalc/TipCalc/App.xaml.cs b/TipCalc/TipCalc/TipCalc/App.xaml.cs
new file mode 100644
index 0000000..0cf5914
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/App.xaml.cs
@@ -0,0 +1,14 @@
+using Application = Microsoft.Maui.Controls.Application;
+
+namespace TipCalc
+{
+ public partial class App : Application
+ {
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new TipCalcPage();
+ }
+ }
+}
diff --git a/TipCalc/TipCalc/TipCalc/DoubleRoundingConverter.cs b/TipCalc/TipCalc/TipCalc/DoubleRoundingConverter.cs
new file mode 100644
index 0000000..0677984
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/DoubleRoundingConverter.cs
@@ -0,0 +1,33 @@
+using Microsoft.Maui.Controls;
+using System;
+using System.Globalization;
+
+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);
+ }
+ }
+}
diff --git a/TipCalc/TipCalc/TipCalc/DoubleToStringConverter.cs b/TipCalc/TipCalc/TipCalc/DoubleToStringConverter.cs
new file mode 100644
index 0000000..3b5ed15
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/DoubleToStringConverter.cs
@@ -0,0 +1,32 @@
+using Microsoft.Maui.Controls;
+using System;
+using System.Globalization;
+
+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;
+ }
+ }
+}
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/Android/AndroidManifest.xml b/TipCalc/TipCalc/TipCalc/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 0000000..85bd4d5
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/Android/MainActivity.cs b/TipCalc/TipCalc/TipCalc/Platforms/Android/MainActivity.cs
new file mode 100644
index 0000000..445fe35
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+using Android.App;
+using Android.Content.PM;
+using Microsoft.Maui;
+
+namespace TipCalc
+{
+ [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
+ public class MainActivity : MauiAppCompatActivity
+ {
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/Android/MainApplication.cs b/TipCalc/TipCalc/TipCalc/Platforms/Android/MainApplication.cs
new file mode 100644
index 0000000..82679d2
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+using System;
+using Android.App;
+using Android.Runtime;
+using Microsoft.Maui;
+
+namespace TipCalc
+{
+ [Application]
+ public class MainApplication : MauiApplication
+ {
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/Android/Resources/values/colors.xml b/TipCalc/TipCalc/TipCalc/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 0000000..c04d749
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/Android/Resources/values/styles.xml b/TipCalc/TipCalc/TipCalc/Platforms/Android/Resources/values/styles.xml
new file mode 100644
index 0000000..b749b60
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/Android/Resources/values/styles.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/AppDelegate.cs b/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/AppDelegate.cs
new file mode 100644
index 0000000..221624b
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+using Microsoft.Maui;
+
+namespace TipCalc
+{
+ [Register("AppDelegate")]
+ public class AppDelegate : MauiUIApplicationDelegate
+ {
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/Info.plist b/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/Info.plist
new file mode 100644
index 0000000..77eae14
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ LSMinimumSystemVersion
+ 10.15
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/Program.cs b/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/Program.cs
new file mode 100644
index 0000000..6a951d9
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/MacCatalyst/Program.cs
@@ -0,0 +1,15 @@
+using UIKit;
+
+namespace TipCalc
+{
+ public class Program
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/iOS/AppDelegate.cs b/TipCalc/TipCalc/TipCalc/Platforms/iOS/AppDelegate.cs
new file mode 100644
index 0000000..221624b
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/iOS/AppDelegate.cs
@@ -0,0 +1,10 @@
+using Foundation;
+using Microsoft.Maui;
+
+namespace TipCalc
+{
+ [Register("AppDelegate")]
+ public class AppDelegate : MauiUIApplicationDelegate
+ {
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/iOS/Entitlements.plist b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Entitlements.plist
new file mode 100644
index 0000000..36a8706
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/iOS/Info.plist b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Info.plist
new file mode 100644
index 0000000..ed2ffb6
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Info.plist
@@ -0,0 +1,34 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 10.3.4
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/appicon.appiconset
+
+
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/iOS/Program.cs b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Program.cs
new file mode 100644
index 0000000..6a951d9
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Program.cs
@@ -0,0 +1,15 @@
+using UIKit;
+
+namespace TipCalc
+{
+ public class Program
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Platforms/iOS/Resources/LaunchScreen.xib b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Resources/LaunchScreen.xib
new file mode 100644
index 0000000..3e5075f
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Platforms/iOS/Resources/LaunchScreen.xib
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc/Resources/Fonts/OpenSans-Regular.ttf b/TipCalc/TipCalc/TipCalc/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000..29bfd35
Binary files /dev/null and b/TipCalc/TipCalc/TipCalc/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/TipCalc/TipCalc/TipCalc/Resources/Images/dotnet_bot.svg b/TipCalc/TipCalc/TipCalc/Resources/Images/dotnet_bot.svg
new file mode 100644
index 0000000..abfaff2
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Resources/Images/dotnet_bot.svg
@@ -0,0 +1,93 @@
+
diff --git a/TipCalc/TipCalc/TipCalc/Resources/appicon.svg b/TipCalc/TipCalc/TipCalc/Resources/appicon.svg
new file mode 100644
index 0000000..9d63b65
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Resources/appicon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Resources/appiconfg.svg b/TipCalc/TipCalc/TipCalc/Resources/appiconfg.svg
new file mode 100644
index 0000000..21dfb25
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Resources/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/Startup.cs b/TipCalc/TipCalc/TipCalc/Startup.cs
new file mode 100644
index 0000000..da1e8ba
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/Startup.cs
@@ -0,0 +1,22 @@
+using Microsoft.Maui;
+using Microsoft.Maui.Hosting;
+using Microsoft.Maui.Controls.Hosting;
+using Microsoft.Maui.Controls.Xaml;
+
+[assembly: XamlCompilationAttribute(XamlCompilationOptions.Compile)]
+
+namespace TipCalc
+{
+ public class Startup : IStartup
+ {
+ public void Configure(IAppHostBuilder appBuilder)
+ {
+ appBuilder
+ .UseMauiApp()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ });
+ }
+ }
+}
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/TipCalc.csproj b/TipCalc/TipCalc/TipCalc/TipCalc.csproj
new file mode 100644
index 0000000..283e2bb
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/TipCalc.csproj
@@ -0,0 +1,47 @@
+
+
+
+
+ net6.0-ios;net6.0-android;net6.0-maccatalyst
+ Exe
+ true
+ true
+ TipCalc
+
+
+ TipCalc
+
+
+ com.companyname.TipCalc
+
+
+ 1.0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ iossimulator-x64
+ maccatalyst-x64
+ False
+
+
+
diff --git a/TipCalc/TipCalc/TipCalc/TipCalcModel.cs b/TipCalc/TipCalc/TipCalc/TipCalcModel.cs
new file mode 100644
index 0000000..f3164f7
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/TipCalcModel.cs
@@ -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));
+ }
+ }
+ }
+}
diff --git a/TipCalc/TipCalc/TipCalc/TipCalcPage.xaml b/TipCalc/TipCalc/TipCalc/TipCalcPage.xaml
new file mode 100644
index 0000000..674b065
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/TipCalcPage.xaml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TipCalc/TipCalc/TipCalc/TipCalcPage.xaml.cs b/TipCalc/TipCalc/TipCalc/TipCalcPage.xaml.cs
new file mode 100644
index 0000000..fd9823e
--- /dev/null
+++ b/TipCalc/TipCalc/TipCalc/TipCalcPage.xaml.cs
@@ -0,0 +1,10 @@
+namespace TipCalc
+{
+ public partial class TipCalcPage
+ {
+ public TipCalcPage()
+ {
+ InitializeComponent();
+ }
+ }
+}