The form XAML
<Window x:Name="myWindow" x:Class="MileageApplicationMorning.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Label Content="Enter Beginning Mileage" HorizontalAlignment="Left" Margin="29,25,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtBeginMileage" HorizontalAlignment="Left" Height="23" Margin="208,28,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Label Content="Enter Ending Mileage" HorizontalAlignment="Left" Margin="41,72,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtEndingMileage" HorizontalAlignment="Left" Height="23" Margin="208,72,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Label Content="Enter Gallons" HorizontalAlignment="Left" Margin="38,113,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtGallons" HorizontalAlignment="Left" Height="23" Margin="208,116,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Button x:Name="btnCalculate" Content="Calculate" HorizontalAlignment="Left" Margin="53,171,0,0" VerticalAlignment="Top" Width="75" Click="btnCalculate_Click"/>
<Label x:Name="lblResult" Content="Label" HorizontalAlignment="Left" Margin="208,168,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.352,-0.24" Width="205" Height="60"/>
</Grid>
</Window>
The code behind the form
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace MileageApplicationMorning
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//this sets the background to a gradient color pattern
myWindow.Background = new LinearGradientBrush(Colors.PowderBlue, Colors.White, 45);
}
private void btnCalculate_Click(object sender, RoutedEventArgs e)
{
//initialize the mileage class
Mileage m = new Mileage();
//declare values for the out parameters of the try parses
int begin;
int end;
double gallons;
//this uses the TryParse in the if statement
//you can do this because the tryParse returns
//a boolean--true or false
if (int.TryParse(txtBeginMileage.Text, out begin))
{
//if it is good assign it to the class
//using the set function of the property
m.BeginMileage = begin;
}
else
{
//otherwise show a message box with a prompt
MessageBox.Show("Enter a valid integer");
return;
}
if (int.TryParse(txtEndingMileage.Text, out end))
{
m.EndMileage = end;
}
else
{
MessageBox.Show("Enter a valid integer");
txtEndingMileage.Clear();
return;
}
if (double.TryParse(txtGallons.Text, out gallons))
{
//for gallons because we threw the error
//if it was a 0 we need to catch the error
//the try tries code. If there is no error
//it just executes the code; if it encounters
//an error it drops to the catch and does
//whatever it says to do, in this case
//just display the error message
try
{
m.Gallons = gallons;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
else
{
MessageBox.Show("Enter a valid double");
txtGallons.Clear();
txtGallons.Focus();
return;
}
double mpg;
try
{
mpg = m.CalculateGasMileage();
//uses the ToString() method of the class
//to display the results of the calculation
lblResult.Content = mpg.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
//changes background colors based on the mpg value
if (mpg > 40)
{
lblResult.Background= new SolidColorBrush(Colors.Green);
}
else if (mpg > 30)
{
lblResult.Background = new SolidColorBrush(Colors.Purple);
}
else if (mpg > 20)
{
lblResult.Background = new SolidColorBrush(Colors.Yellow);
}
else
{
lblResult.Background = new SolidColorBrush(Colors.Red);
}
}
}
}
The Mileage class code with the throw exception in the Gallons Property
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MileageApplicationMorning
{
class Mileage
{
//class variables or fields
//fields should be private
private int beginMileage;
private int endMileage;
private double pricePerGallon;
private double gallons;
//constructors are ways of constructing
//the class, they set the initial values
//a constructor always has the same name
//as the the class and no return type
//A class can have several "overloaded" constructors
//only one is used per instance of the class
//the user chooses which constructor he or she
//wants to use by the signature (what parameters it takes)
//this is a default constructor. It has no arguments
//and sets all the properties to their minumum value;
//If you write no constructor at all this is what you get
//if you do write a constructor it is up to you to
//provide the initial values
public Mileage()
{
PricePerGallon = 1;
BeginMileage = 0;
EndMileage = 0;
Gallons = 1; //had to change to 1 to keep
//from throwing the error on calling
//the class
}
//this is an overloaded constructor that takes three
//values. A user could choose to do this rather than
//set the values using the properties
public Mileage(int begin, int end, double gal)
{
BeginMileage = begin;
EndMileage = end;
Gallons = gal;
PricePerGallon = 0;
}
//this constructor takes four values
public Mileage(int begin, int end, double gal, double price)
{
BeginMileage = begin;
EndMileage = end;
Gallons = gal;
PricePerGallon = price;
}
//public properties are ways
//to expose the fields in a
//controlled way
//you can do some validation
//and testing in a property
public double PricePerGallon
{
get { return pricePerGallon; }
set { pricePerGallon = value; }
}
public double Gallons
{
get { return gallons; }
set
{
//here we are going to test to see
//if the value passed in is equal to 0
//if it is we will throw an exception
//that we can handle in the form
if (value == 0)
{
throw new DivideByZeroException();
}
else
{
gallons = value;
}
}
}
public int BeginMileage
{
get { return beginMileage; }
set {
beginMileage = value;
}
}
public int EndMileage
{
get { return endMileage; }
set {endMileage = value; }
}
//a class can contain both private (internal)
//methods and public methods
private int TotalMiles()
{
return EndMileage - BeginMileage;
}
//public method accessible from other
//classes
public double CalculateGasMileage()
{
int total = TotalMiles();
double milesPerGallon = total / Gallons;
return milesPerGallon;
}
//this is an overloaded method. It has the same
//name but a different signature than the previous method
//again it gives a user of the class another option
//of how to use the class and call the method
public double CalculateGasMileage(int bMiles, int eMiles, double gals)
{
BeginMileage = bMiles;
EndMileage = eMiles;
Gallons = gals;
int total = TotalMiles();
double milesPerGallon = total / Gallons;
return milesPerGallon;
}
//this is "overriding" the ToString method
//which every class inherits from Object
//the parent of all classes in .NET
//the combination of overloading and overwriting is
//what constitutes the object oriented principle of
//polymorphism--the ability of a class
//to behave differently in different environments
public override string ToString()
{
double mpg = CalculateGasMileage();
return "Your gas mileage is" + mpg.ToString("##.##");
}
}
}