diff --git a/Billing.Shared/Billing.Shared.projitems b/Billing.Shared/Billing.Shared.projitems
index 2f2dce2..e9c4261 100644
--- a/Billing.Shared/Billing.Shared.projitems
+++ b/Billing.Shared/Billing.Shared.projitems
@@ -24,6 +24,7 @@
+
@@ -33,10 +34,15 @@
+
AccountPage.xaml
+
+ AddAccountPage.xaml
+ Code
+
AddBillPage.xaml
@@ -73,4 +79,9 @@
MSBuild:UpdateDesignTimeXaml
+
+
+ MSBuild:UpdateDesignTimeXaml
+
+
\ No newline at end of file
diff --git a/Billing.Shared/Languages/en.xml b/Billing.Shared/Languages/en.xml
index 260deee..f800353 100644
--- a/Billing.Shared/Languages/en.xml
+++ b/Billing.Shared/Languages/en.xml
@@ -11,6 +11,20 @@
Fr
Sa
Bills not yet generated
- Click here to record
+ Click here to record
MM/dd/yyyy
+ Balance
+ Assets
+ Liability
+ Add Account
+ Account Name
+ Please enter account name
+ Icon
+ Category
+ Balance
+ Please enter the balance
+ Currency
+ Chinese Yuan (CNY)
+ Note
+ Please enter a note
\ No newline at end of file
diff --git a/Billing.Shared/Languages/zh-CN.xml b/Billing.Shared/Languages/zh-CN.xml
index 21fda81..dcecf10 100644
--- a/Billing.Shared/Languages/zh-CN.xml
+++ b/Billing.Shared/Languages/zh-CN.xml
@@ -11,6 +11,20 @@
周五
周六
还未产生账单
- 点此记录
+ 点此记录
yyyy年MM月dd日
+ 余额
+ 资产
+ 负债
+ 新建账户
+ 账户名称
+ 请输入账户名称
+ 图标
+ 种类
+ 余额
+ 请输入余额
+ 币种
+ 人民币 (CNY)
+ 备注
+ 请输入备注
\ No newline at end of file
diff --git a/Billing.Shared/Models/Account.cs b/Billing.Shared/Models/Account.cs
new file mode 100644
index 0000000..b7d57a6
--- /dev/null
+++ b/Billing.Shared/Models/Account.cs
@@ -0,0 +1,41 @@
+using System.Xml.Linq;
+
+namespace Billing.Models;
+
+public class Account : BaseModel
+{
+ public int Id { get; set; }
+ public string Icon { get; set; } = ICON_DEFAULT;
+ public AccountCategory Category { get; set; }
+ public string Name { get; set; }
+ public decimal Balance { get; set; }
+ public string Memo { get; set; }
+
+ public override void OnXmlDeserialize(XElement node)
+ {
+ Id = Read(node, nameof(Id), 0);
+ Icon = Read(node, nameof(Icon), ICON_DEFAULT);
+ Category = (AccountCategory)Read(node, nameof(Category), 0);
+ Name = Read(node, nameof(Name), string.Empty);
+ Balance = Read(node, nameof(Balance), 0m);
+ Memo = Read(node, nameof(Memo), null);
+ }
+
+ public override void OnXmlSerialize(XElement node)
+ {
+ Write(node, nameof(Id), Id);
+ Write(node, nameof(Icon), Icon);
+ Write(node, nameof(Category), (int)Category);
+ Write(node, nameof(Name), Name);
+ Write(node, nameof(Balance), Balance);
+ Write(node, nameof(Memo), Memo);
+ }
+}
+
+public enum AccountCategory
+{
+ Cash = 0,
+ CreditCard,
+ DebitCard,
+ ElecAccount
+}
diff --git a/Billing.Shared/Models/BaseModel.cs b/Billing.Shared/Models/BaseModel.cs
index 647af34..410765b 100644
--- a/Billing.Shared/Models/BaseModel.cs
+++ b/Billing.Shared/Models/BaseModel.cs
@@ -16,6 +16,8 @@ public interface IModel
public abstract class BaseModel : IModel, IDisposable
{
+ protected const string ICON_DEFAULT = "ic_default";
+
private bool disposed = false;
public static T ParseXml(string xml) where T : BaseModel, new()
diff --git a/Billing.Shared/Models/Billing.cs b/Billing.Shared/Models/Billing.cs
index 0b38869..2dbc676 100644
--- a/Billing.Shared/Models/Billing.cs
+++ b/Billing.Shared/Models/Billing.cs
@@ -8,6 +8,7 @@ public class Billing : BaseModel
public decimal Amount { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
+ public int WalletId { get; set; }
public string Store { get; set; }
public DateTime CreateTime { get; set; }
@@ -16,6 +17,7 @@ public class Billing : BaseModel
Amount = Read(node, nameof(Amount), 0m);
Name = Read(node, nameof(Name), string.Empty);
CategoryId = Read(node, nameof(CategoryId), -1);
+ WalletId = Read(node, nameof(WalletId), -1);
Store = Read(node, nameof(Store), string.Empty);
CreateTime = Read(node, nameof(CreateTime), default(DateTime));
}
@@ -25,6 +27,7 @@ public class Billing : BaseModel
Write(node, nameof(Amount), Amount);
Write(node, nameof(Name), Name);
Write(node, nameof(CategoryId), CategoryId);
+ Write(node, nameof(WalletId), WalletId);
Write(node, nameof(Store), Store);
Write(node, nameof(CreateTime), CreateTime);
}
diff --git a/Billing.Shared/Models/Category.cs b/Billing.Shared/Models/Category.cs
index 213aa1b..b6d44d3 100644
--- a/Billing.Shared/Models/Category.cs
+++ b/Billing.Shared/Models/Category.cs
@@ -5,12 +5,14 @@ namespace Billing.Models;
public class Category : BaseModel
{
public int Id { get; set; }
+ public string Icon { get; set; } = ICON_DEFAULT;
public string Name { get; set; }
public int? ParentId { get; set; }
public override void OnXmlDeserialize(XElement node)
{
Id = Read(node, nameof(Id), 0);
+ Icon = Read(node, nameof(Icon), ICON_DEFAULT);
Name = Read(node, nameof(Name), string.Empty);
var parentId = Read(node, nameof(ParentId), -1);
if (parentId >= 0)
@@ -22,6 +24,7 @@ public class Category : BaseModel
public override void OnXmlSerialize(XElement node)
{
Write(node, nameof(Id), Id);
+ Write(node, nameof(Icon), Icon);
Write(node, nameof(Name), Name);
if (ParentId != null)
{
diff --git a/Billing.Shared/Themes/BaseTheme.cs b/Billing.Shared/Themes/BaseTheme.cs
index ccf8bc5..13b9baf 100644
--- a/Billing.Shared/Themes/BaseTheme.cs
+++ b/Billing.Shared/Themes/BaseTheme.cs
@@ -9,7 +9,9 @@ public abstract class BaseTheme : ResourceDictionary
public const string CascadiaFontBold = nameof(CascadiaFontBold);
public const string RobotoCondensedFontRegular = nameof(RobotoCondensedFontRegular);
public const string RobotoCondensedFontBold = nameof(RobotoCondensedFontBold);
+
public const string WindowBackgroundColor = nameof(WindowBackgroundColor);
+ public const string OptionTintColor = nameof(OptionTintColor);
public const string PromptBackgroundColor = nameof(PromptBackgroundColor);
public const string PrimaryColor = nameof(PrimaryColor);
public const string SecondaryColor = nameof(SecondaryColor);
@@ -18,7 +20,8 @@ public abstract class BaseTheme : ResourceDictionary
public const string TabBarUnselectedColor = nameof(TabBarUnselectedColor);
public const string OutRangeDayColor = nameof(OutRangeDayColor);
public const string TextColor = nameof(TextColor);
- public const string WeekendColor = nameof(WeekendColor);
+ public const string SecondaryTextColor = nameof(SecondaryTextColor);
+ public const string RedColor = nameof(RedColor);
protected abstract Color PrimaryMauiColor { get; }
protected abstract Color SecondaryMauiColor { get; }
@@ -44,6 +47,14 @@ public abstract class BaseTheme : ResourceDictionary
new Setter { Property = Label.FontFamilyProperty, Value = robotoRegularFontFamily }
}
});
+ Add(new Style(typeof(OptionEntry))
+ {
+ Setters =
+ {
+ new Setter { Property = Entry.FontSizeProperty, Value = Device.GetNamedSize(NamedSize.Small, typeof(Entry)) },
+ new Setter { Property = Entry.FontFamilyProperty, Value = robotoRegularFontFamily }
+ }
+ });
Add(new Style(typeof(Button))
{
Setters =
diff --git a/Billing.Shared/Themes/Dark.cs b/Billing.Shared/Themes/Dark.cs
index 4e9f1d4..b99a16f 100644
--- a/Billing.Shared/Themes/Dark.cs
+++ b/Billing.Shared/Themes/Dark.cs
@@ -1,4 +1,5 @@
-using Xamarin.Forms;
+using Billing.UI;
+using Xamarin.Forms;
namespace Billing.Themes;
@@ -20,12 +21,14 @@ public class Dark : BaseTheme
private void InitColors()
{
Add(WindowBackgroundColor, Color.Black);
+ Add(OptionTintColor, Color.FromRgb(28, 28, 28));
Add(PromptBackgroundColor, Color.FromRgb(0x1f, 0x1f, 0x1f));
Add(TabBarBackgroundColor, Color.Black);
Add(TabBarUnselectedColor, Color.FromRgb(0x82, 0x82, 0x82));
Add(OutRangeDayColor, Color.DarkGray);
Add(TextColor, Color.FromRgb(0xcc, 0xcc, 0xcc));
- Add(WeekendColor, Color.FromRgb(211, 5, 5));
+ Add(SecondaryTextColor, Color.LightGray);
+ Add(RedColor, Color.FromRgb(211, 5, 5));
Add(new Style(typeof(TabBar))
{
@@ -36,5 +39,12 @@ public class Dark : BaseTheme
new Setter { Property = Shell.TabBarUnselectedColorProperty, Value = Color.FromRgb(0x82, 0x82, 0x82) }
}
});
+ Add(new Style(typeof(TableView))
+ {
+ Setters =
+ {
+ new Setter { Property = VisualElement.BackgroundColorProperty, Value = Color.Black }
+ }
+ });
}
}
diff --git a/Billing.Shared/Themes/Light.cs b/Billing.Shared/Themes/Light.cs
index 4684a0e..d05b3a7 100644
--- a/Billing.Shared/Themes/Light.cs
+++ b/Billing.Shared/Themes/Light.cs
@@ -1,4 +1,5 @@
-using Xamarin.Forms;
+using Billing.UI;
+using Xamarin.Forms;
namespace Billing.Themes;
@@ -20,12 +21,14 @@ public class Light : BaseTheme
private void InitColors()
{
Add(WindowBackgroundColor, Color.White);
+ Add(OptionTintColor, Color.White);
Add(PromptBackgroundColor, Color.FromRgb(0xe0, 0xe0, 0xe0));
Add(TabBarBackgroundColor, Color.White);
Add(TabBarUnselectedColor, Color.FromRgb(0x82, 0x82, 0x82));
Add(OutRangeDayColor, Color.LightGray);
Add(TextColor, Color.FromRgb(0x33, 0x33, 0x33));
- Add(WeekendColor, Color.FromRgb(211, 64, 85));
+ Add(SecondaryTextColor, Color.DimGray);
+ Add(RedColor, Color.FromRgb(211, 64, 85));
Add(new Style(typeof(TabBar))
{
@@ -36,5 +39,12 @@ public class Light : BaseTheme
new Setter { Property = Shell.TabBarUnselectedColorProperty, Value = Color.FromRgb(0x82, 0x82, 0x82) }
}
});
+ Add(new Style(typeof(TableView))
+ {
+ Setters =
+ {
+ new Setter { Property = VisualElement.BackgroundColorProperty, Value = Color.FromRgb(242, 241, 245) }
+ }
+ });
}
}
diff --git a/Billing.Shared/UI/BillingDate.xaml b/Billing.Shared/UI/BillingDate.xaml
index 4136f90..385ceeb 100644
--- a/Billing.Shared/UI/BillingDate.xaml
+++ b/Billing.Shared/UI/BillingDate.xaml
@@ -37,7 +37,7 @@
(string)GetValue(TitleProperty);
+ set => SetValue(TitleProperty, value);
+ }
+ public Color BackgroundColor
+ {
+ get => (Color)GetValue(BackgroundColorProperty);
+ set => SetValue(BackgroundColorProperty, value);
+ }
+
+ protected abstract View Content { get; }
+
+ public OptionCell()
+ {
+ View = new Grid
+ {
+ BindingContext = this,
+ Padding = new Thickness(20, 0),
+ ColumnDefinitions =
+ {
+ new ColumnDefinition { Width = new GridLength(.3, GridUnitType.Star) },
+ new ColumnDefinition { Width = new GridLength(.7, GridUnitType.Star) }
+ },
+ Children =
+ {
+ new Label
+ {
+ LineBreakMode = LineBreakMode.TailTruncation,
+ VerticalOptions = LayoutOptions.Center
+ }
+ .Binding(Label.TextProperty, nameof(Title))
+ .DynamicResource(Label.TextColorProperty, BaseTheme.TextColor),
+
+ Content.GridColumn(1)
+ }
+ }
+ .DynamicResource(VisualElement.BackgroundColorProperty, BaseTheme.OptionTintColor);
+ }
+}
+
+public class OptionTextCell : OptionCell
+{
+ public static readonly BindableProperty DetailProperty = BindableProperty.Create(nameof(Detail), typeof(string), typeof(OptionTextCell));
+
+ public string Detail
+ {
+ get => (string)GetValue(DetailProperty);
+ set => SetValue(DetailProperty, value);
+ }
+
+ protected override View Content => new Label
+ {
+ HorizontalOptions = LayoutOptions.End,
+ VerticalOptions = LayoutOptions.Center
+ }
+ .Binding(Label.TextProperty, nameof(Detail))
+ .DynamicResource(Label.TextColorProperty, BaseTheme.SecondaryTextColor);
+}
+
+public class OptionSwitchCell : OptionCell
+{
+ public static readonly BindableProperty IsToggledProperty = BindableProperty.Create(nameof(IsToggled), typeof(bool), typeof(OptionSwitchCell));
+
+ public bool IsToggled
+ {
+ get => (bool)GetValue(IsToggledProperty);
+ set => SetValue(IsToggledProperty, value);
+ }
+
+ protected override View Content => new Switch
+ {
+ HorizontalOptions = LayoutOptions.End,
+ VerticalOptions = LayoutOptions.Center
+ }
+ .Binding(Switch.IsToggledProperty, nameof(IsToggled), BindingMode.TwoWay);
+}
+
+public class OptionEntryCell : OptionCell
+{
+ public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(OptionEntryCell));
+ public static readonly BindableProperty KeyboardProperty = BindableProperty.Create(nameof(Keyboard), typeof(Keyboard), typeof(OptionEntryCell));
+ public static readonly BindableProperty PlaceholderProperty = BindableProperty.Create(nameof(Placeholder), typeof(string), typeof(OptionEntryCell));
+
+ public string Text
+ {
+ get => (string)GetValue(TextProperty);
+ set => SetValue(TextProperty, value);
+ }
+ public Keyboard Keyboard
+ {
+ get => (Keyboard)GetValue(KeyboardProperty);
+ set => SetValue(KeyboardProperty, value);
+ }
+ public string Placeholder
+ {
+ get => (string)GetValue(PlaceholderProperty);
+ set => SetValue(PlaceholderProperty, value);
+ }
+
+ protected override View Content => new OptionEntry
+ {
+ HorizontalOptions = LayoutOptions.Fill,
+ HorizontalTextAlignment = TextAlignment.End,
+ VerticalOptions = LayoutOptions.Center,
+ ReturnType = ReturnType.Next
+ }
+ .Binding(Entry.TextProperty, nameof(Text), BindingMode.TwoWay)
+ .Binding(InputView.KeyboardProperty, nameof(Keyboard))
+ .Binding(Entry.PlaceholderProperty, nameof(Placeholder))
+ .DynamicResource(Entry.TextColorProperty, BaseTheme.TextColor)
+ .DynamicResource(Entry.PlaceholderColorProperty, BaseTheme.SecondaryTextColor)
+ .DynamicResource(VisualElement.BackgroundColorProperty, BaseTheme.OptionTintColor);
+}
\ No newline at end of file
diff --git a/Billing.Shared/UI/CustomEffect.cs b/Billing.Shared/UI/CustomEffect.cs
new file mode 100644
index 0000000..2be1af0
--- /dev/null
+++ b/Billing.Shared/UI/CustomEffect.cs
@@ -0,0 +1,15 @@
+using Xamarin.Forms;
+
+namespace Billing.UI;
+
+public class ShadowEffect : RoutingEffect
+{
+ public float Radius { get; set; }
+ public Color Color { get; set; }
+ public Size Offect { get; set; }
+ public float Opacity { get; set; }
+
+ public ShadowEffect() : base($"Org.Tsanie.{nameof(ShadowEffect)}")
+ {
+ }
+}
diff --git a/Billing.Shared/UI/Definition.cs b/Billing.Shared/UI/Definition.cs
index 63b5571..392eb12 100644
--- a/Billing.Shared/UI/Definition.cs
+++ b/Billing.Shared/UI/Definition.cs
@@ -1,4 +1,7 @@
-namespace Billing.UI;
+using System;
+using Xamarin.Forms;
+
+namespace Billing.UI;
public static partial class Definition
{
@@ -7,3 +10,59 @@ public static partial class Definition
public static partial string GetRobotoCondensedRegularFontFamily();
public static partial string GetRobotoCondensedBoldFontFamily();
}
+
+public static class ExtensionHelper
+{
+ public static View Binding(this View view, BindableProperty property, string path, BindingMode mode = BindingMode.Default, IValueConverter converter = null)
+ {
+ view.SetBinding(property, path, mode, converter);
+ return view;
+ }
+
+ public static View DynamicResource(this View view, BindableProperty property, string key)
+ {
+ view.SetDynamicResource(property, key);
+ return view;
+ }
+
+ public static View GridColumn(this View view, int column)
+ {
+ Grid.SetColumn(view, column);
+ return view;
+ }
+
+ public static View GridRow(this View view, int row)
+ {
+ Grid.SetRow(view, row);
+ return view;
+ }
+}
+
+public class Tap : IDisposable
+{
+ private readonly static object sync = new();
+ private static Tap instance;
+
+ private bool busy = false;
+
+ private Tap() { }
+
+ public static bool IsBusy => instance?.busy ?? false;
+
+ public static Tap Start()
+ {
+ lock (sync)
+ {
+ (instance ??= new Tap()).busy = true;
+ }
+ return instance;
+ }
+
+ public void Dispose()
+ {
+ lock (sync)
+ {
+ busy = false;
+ }
+ }
+}
diff --git a/Billing.Shared/Views/AccountPage.xaml b/Billing.Shared/Views/AccountPage.xaml
index 3c37d1c..6e53c84 100644
--- a/Billing.Shared/Views/AccountPage.xaml
+++ b/Billing.Shared/Views/AccountPage.xaml
@@ -2,12 +2,44 @@
-
-
-
+ x:Name="accountPage"
+ x:DataType="v:AccountPage"
+ Title="{r:Text Accounts}"
+ BindingContext="{x:Reference accountPage}">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Billing.Shared/Views/AccountPage.xaml.cs b/Billing.Shared/Views/AccountPage.xaml.cs
index 6711f02..28a5064 100644
--- a/Billing.Shared/Views/AccountPage.xaml.cs
+++ b/Billing.Shared/Views/AccountPage.xaml.cs
@@ -1,11 +1,44 @@
using Billing.UI;
+using System;
+using Xamarin.Forms;
namespace Billing.Views;
public partial class AccountPage : BillingPage
{
+ private static readonly BindableProperty BalanceProperty = BindableProperty.Create(nameof(Balance), typeof(decimal), typeof(AccountPage));
+ private static readonly BindableProperty AssetProperty = BindableProperty.Create(nameof(Asset), typeof(decimal), typeof(AccountPage));
+ private static readonly BindableProperty LiabilityProperty = BindableProperty.Create(nameof(Liability), typeof(decimal), typeof(AccountPage));
+
+ public decimal Balance => (decimal)GetValue(BalanceProperty);
+ public decimal Asset => (decimal)GetValue(AssetProperty);
+ public decimal Liability => (decimal)GetValue(LiabilityProperty);
+
+ public Command AddAccount { get; }
+
public AccountPage()
{
+ AddAccount = new Command(OnAddAccount);
+
InitializeComponent();
}
+
+ private async void OnAddAccount()
+ {
+ if (Tap.IsBusy)
+ {
+ return;
+ }
+ using (Tap.Start())
+ {
+ var page = new AddAccountPage();
+ page.AccountChecked += AccountChecked;
+ await Navigation.PushAsync(page);
+ }
+ }
+
+ private void AccountChecked(object sender, AccountEventArgs e)
+ {
+ Helper.Debug(e.Account.ToString());
+ }
}
diff --git a/Billing.Shared/Views/AddAccountPage.xaml b/Billing.Shared/Views/AddAccountPage.xaml
new file mode 100644
index 0000000..9f1905f
--- /dev/null
+++ b/Billing.Shared/Views/AddAccountPage.xaml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Billing.Shared/Views/AddAccountPage.xaml.cs b/Billing.Shared/Views/AddAccountPage.xaml.cs
new file mode 100644
index 0000000..93c5ed9
--- /dev/null
+++ b/Billing.Shared/Views/AddAccountPage.xaml.cs
@@ -0,0 +1,86 @@
+using Billing.Models;
+using Billing.UI;
+using System;
+using Xamarin.Forms;
+
+namespace Billing.Views;
+
+public partial class AddAccountPage : BillingPage
+{
+ private static readonly BindableProperty AccountNameProperty = BindableProperty.Create(nameof(AccountName), typeof(string), typeof(AddAccountPage));
+ private static readonly BindableProperty AccountIconProperty = BindableProperty.Create(nameof(AccountIcon), typeof(string), typeof(AddAccountPage));
+ private static readonly BindableProperty CategoryProperty = BindableProperty.Create(nameof(Category), typeof(string), typeof(AddAccountPage));
+ private static readonly BindableProperty BalanceProperty = BindableProperty.Create(nameof(Balance), typeof(decimal), typeof(AddAccountPage));
+ private static readonly BindableProperty MemoProperty = BindableProperty.Create(nameof(Memo), typeof(string), typeof(AddAccountPage));
+
+ public string AccountName
+ {
+ get => (string)GetValue(AccountNameProperty);
+ set => SetValue(AccountNameProperty, value);
+ }
+ public string AccountIcon
+ {
+ get => (string)GetValue(AccountIconProperty);
+ set => SetValue(AccountIconProperty, value);
+ }
+ public string Category
+ {
+ get => (string)GetValue(CategoryProperty);
+ set => SetValue(CategoryProperty, value);
+ }
+ public decimal Balance
+ {
+ get => (decimal)GetValue(BalanceProperty);
+ set => SetValue(BalanceProperty, value);
+ }
+ public string Memo
+ {
+ get => (string)GetValue(MemoProperty);
+ set => SetValue(MemoProperty, value);
+ }
+
+ private readonly Account account;
+
+ public Command CheckAccount { get; }
+
+ public event EventHandler AccountChecked;
+
+ public AddAccountPage()
+ {
+ CheckAccount = new Command(OnCheckAccount);
+ InitializeComponent();
+ }
+
+ public AddAccountPage(Account account)
+ {
+ this.account = account;
+ AccountName = account.Name;
+ AccountIcon = account.Icon;
+ Category = account.Category.ToString();
+ Balance = account.Balance;
+ Memo = account.Memo;
+ CheckAccount = new Command(OnCheckAccount);
+ InitializeComponent();
+ }
+
+ private void OnCheckAccount()
+ {
+ AccountChecked?.Invoke(this, new AccountEventArgs
+ {
+ Account = new Account
+ {
+ Id = account?.Id ?? -1,
+ Name = AccountName,
+ Icon = AccountIcon,
+ //Category = Category,
+ Balance = Balance,
+ Memo = Memo
+ }
+ });
+ }
+}
+
+public class AccountEventArgs : EventArgs
+{
+ public Account Account { get; set; }
+}
diff --git a/Billing.Shared/Views/BillPage.xaml b/Billing.Shared/Views/BillPage.xaml
index 8bd0c66..96672b9 100644
--- a/Billing.Shared/Views/BillPage.xaml
+++ b/Billing.Shared/Views/BillPage.xaml
@@ -39,7 +39,7 @@
-