From a25a7fb3fd81b5817e514b71c3aab7e22204deea Mon Sep 17 00:00:00 2001 From: Claudiu Farcas Date: Fri, 25 Mar 2011 13:47:13 +0200 Subject: [PATCH] tombstoning - saving and loadign from IsolateStorage --- main/MyFriendsAround.WP7/App.xaml.cs | 38 ++++++++++ .../MyFriendsAround.WP7.csproj | 1 + .../Utils/ApplicationExtensions.cs | 60 ++++++++++++++++ .../ViewModel/MainViewModel.cs | 26 ++++++- .../ViewModel/ViewModelLocator.cs | 14 ++-- main/MyFriendsAround.WP7/Views/MainPage.xaml | 72 +++++++++++-------- 6 files changed, 173 insertions(+), 38 deletions(-) create mode 100644 main/MyFriendsAround.WP7/Utils/ApplicationExtensions.cs diff --git a/main/MyFriendsAround.WP7/App.xaml.cs b/main/MyFriendsAround.WP7/App.xaml.cs index ff61a3e..97e1652 100644 --- a/main/MyFriendsAround.WP7/App.xaml.cs +++ b/main/MyFriendsAround.WP7/App.xaml.cs @@ -13,6 +13,8 @@ using System.Windows.Shapes; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using MyFriendsAround.WP7.ViewModel; +using MyFriendsAround.WP7.Utils; + namespace MyFriendsAround.WP7 { @@ -43,28 +45,63 @@ namespace MyFriendsAround.WP7 // This code will not execute when the application is reactivated private void Application_Launching(object sender, LaunchingEventArgs e) { + LoadModel(); } // Code to execute when the application is activated (brought to foreground) // This code will not execute when the application is first launched private void Application_Activated(object sender, ActivatedEventArgs e) { + LoadModel(); } // Code to execute when the application is deactivated (sent to background) // This code will not execute when the application is closing private void Application_Deactivated(object sender, DeactivatedEventArgs e) { + SaveModel(); } // Code to execute when the application is closing (eg, user hit Back) // This code will not execute when the application is deactivated private void Application_Closing(object sender, ClosingEventArgs e) { + SaveModel(); + // ViewModelLocator locator = Container.Instance.Resolve(); locator.Cleanup(); } + + private void LoadModel() + { + MainViewModel mainModel = this.RetrieveFromIsolatedStorage(); + if (mainModel != null) + { + Container.Instance.RegisterInstance(mainModel, "MainViewModel"); + } + else + { + Container.Instance.RegisterInstance(new MainViewModel(), "MainViewModel"); + } + AboutViewModel aboutModel = this.RetrieveFromIsolatedStorage(); + if (aboutModel != null) + { + Container.Instance.RegisterInstance(aboutModel, "AboutViewModel"); + } + else + { + Container.Instance.RegisterInstance( new AboutViewModel(), "AboutViewModel"); + } + } + + private void SaveModel() + { + this.SaveToIsolatedStorage(Container.Instance.Resolve("MainViewModel")); + this.SaveToIsolatedStorage(Container.Instance.Resolve("AboutViewModel")); + } + + // Code to execute if a navigation fails void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) { @@ -85,6 +122,7 @@ namespace MyFriendsAround.WP7 } } + #region Phone application initialization // Avoid double-initialization diff --git a/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj b/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj index 59c6ecb..aff3d71 100644 --- a/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj +++ b/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj @@ -118,6 +118,7 @@ + AboutPage.xaml diff --git a/main/MyFriendsAround.WP7/Utils/ApplicationExtensions.cs b/main/MyFriendsAround.WP7/Utils/ApplicationExtensions.cs new file mode 100644 index 0000000..062b161 --- /dev/null +++ b/main/MyFriendsAround.WP7/Utils/ApplicationExtensions.cs @@ -0,0 +1,60 @@ +using System; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using System.IO.IsolatedStorage; +using System.IO; +using MyFriendsAround.WP7.ViewModel; +using System.Text; + +namespace MyFriendsAround.WP7.Utils +{ + public static class ApplicationExtensions + { + + private static string GetIsFile(Type t) + { + return string.Concat(t.Name, ".dat"); + } + + + public static T RetrieveFromIsolatedStorage(this Application app) where T : class + { + using (var userAppStore = IsolatedStorageFile.GetUserStoreForApplication()) + { + var dataFileName = GetIsFile(typeof(T)); + if (userAppStore.FileExists(dataFileName)) + { + using(StreamReader sr =new StreamReader(userAppStore.OpenFile(dataFileName, FileMode.Open), Encoding.UTF8)) + { + return SerializationHelper.Deserialize(sr.ReadToEnd()); + } + } + } + return null; + } + + public static void SaveToIsolatedStorage(this Application app, T model) where T : class + { + var dataFileName = GetIsFile((model.GetType())); + using (var userAppStore = IsolatedStorageFile.GetUserStoreForApplication()) + { + if (userAppStore.FileExists(dataFileName)) + { + userAppStore.DeleteFile(dataFileName); + } + using (StreamWriter sw = new StreamWriter(userAppStore.CreateFile(dataFileName), Encoding.UTF8)) + { + sw.Write(SerializationHelper.Serialize(model)); + } + } + } + + } +} diff --git a/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs b/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs index 5329081..01298c6 100644 --- a/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs +++ b/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs @@ -171,7 +171,31 @@ namespace MyFriendsAround.WP7.ViewModel } - public string MyName { get; set; } + /// + /// The property's name. + /// + public const string MyNamePropertyName = "MyName"; + private string _myName = "Guest"; + + /// + /// Gets the MyName property. + /// + public string MyName + { + get { return _myName; } + set + { + if (_myName == value) + { + return; + } + var oldValue = _myName; + _myName = value; + // Update bindings, no broadcast + RaisePropertyChanged(MyNamePropertyName); + } + } + public string AppBarTextAbout { get { return "About"; } diff --git a/main/MyFriendsAround.WP7/ViewModel/ViewModelLocator.cs b/main/MyFriendsAround.WP7/ViewModel/ViewModelLocator.cs index 132d4f0..c411286 100644 --- a/main/MyFriendsAround.WP7/ViewModel/ViewModelLocator.cs +++ b/main/MyFriendsAround.WP7/ViewModel/ViewModelLocator.cs @@ -74,8 +74,6 @@ namespace MyFriendsAround.WP7.ViewModel // Create run time view models } - Container.Instance.RegisterInstance(typeof(MainViewModel), "MainViewModel"); - Container.Instance.RegisterInstance(typeof(AboutViewModel), "AboutViewModel"); } /// @@ -85,7 +83,7 @@ namespace MyFriendsAround.WP7.ViewModel { get { - MainViewModel mainViewModel = GetViewModel(); + MainViewModel mainViewModel = GetViewModel("MainViewModel"); return mainViewModel; } } @@ -97,7 +95,7 @@ namespace MyFriendsAround.WP7.ViewModel { get { - AboutViewModel aboutViewModel = GetViewModel(); + AboutViewModel aboutViewModel = GetViewModel("AboutViewModel"); return aboutViewModel; } } @@ -108,9 +106,9 @@ namespace MyFriendsAround.WP7.ViewModel /// public void Cleanup() { - MainViewModel mainViewModel = GetViewModel(); + MainViewModel mainViewModel = GetViewModel("MainViewModel"); mainViewModel.Cleanup(); - AboutViewModel aboutViewModel = GetViewModel(); + AboutViewModel aboutViewModel = GetViewModel("AboutViewModel"); aboutViewModel.Cleanup(); } @@ -118,10 +116,10 @@ namespace MyFriendsAround.WP7.ViewModel #region Local Helpers - private T GetViewModel() where T : ViewModelBase + private T GetViewModel(string key) where T : ViewModelBase { // Create a new view model - T vm = Container.Instance.Resolve(); + T vm = Container.Instance.Resolve(key); //Assign the Context from PageNavigation to Context property of the ViewModelBase vm.Context = vm.PageNav.CurrentContext; diff --git a/main/MyFriendsAround.WP7/Views/MainPage.xaml b/main/MyFriendsAround.WP7/Views/MainPage.xaml index 7856dc7..5b6dbb6 100644 --- a/main/MyFriendsAround.WP7/Views/MainPage.xaml +++ b/main/MyFriendsAround.WP7/Views/MainPage.xaml @@ -1,10 +1,14 @@ - + xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps" + xmlns:Preview="clr-namespace:Phone7.Fx.Preview;assembly=Phone7.Fx.Preview"> - + + Width="32" + Margin="-16,-16,0,0"> @@ -32,25 +38,28 @@ - - - - + Background="Transparent"> + + + + - - - - + + + + - - + - + - + + Template="{StaticResource PushpinControlTemplate1}"> @@ -102,15 +116,15 @@ - + - - - + \ No newline at end of file