ViewModel
public class MainViewModel : BaseViewModel
{
private IDictionary _settings = Application.Current.Properties;
public override void OnAppearing()
{
base.OnAppearing();
RunReadFlow();
}
public override Task OnDisappearing()
{
RunSaveFlow();
return base.OnDisappearing();
}
private void RunReadFlow()
{
string jsonString = string.Empty;
string key = nameof(Person);
if (_settings.ContainsKey(key))
{
jsonString = _settings[key] as string;
}
Person = JsonConvert.DeserializeObject(jsonString) ?? defaultPerson;
}
private void RunSaveFlow()
{
string key = nameof(Person);
_settings[key] = JsonConvert.SerializeObject(Person);
}
}
(使用Application.Current.Properties來儲存或讀取設定值,在讀取前如果沒有key會Crash,需先用ContainsKey檢查)
App.xaml.cs
public partial class App : Application
{
public App ()
{
InitializeComponent();
MainPage = new MilitaryCountdown.MainPage();
}
protected override void OnStart ()
{
}
protected override void OnSleep ()
{
var page = Application.Current.MainPage as BasePage;
page.OnSleep();
}
protected override void OnResume ()
{
var page = Application.Current.MainPage as BasePage;
page.OnResume();
}
}
(將目前頁面轉型成BasePage(需先繼承BasePage),然後再Call自定的Method)
BasePage
public partial class BasePage : ContentPage
{
private BaseViewModel _viewModel => BindingContext as BaseViewModel;
public BasePage()
{
}
public void OnResume()
{
OnAppearing();
}
public void OnSleep()
{
OnDisappearing();
}
protected override void OnAppearing()
{
base.OnAppearing();
_viewModel?.OnAppearing();
}
protected override async void OnDisappearing()
{
await _viewModel?.OnDisappearing();
base.OnDisappearing();
}
}
(定義OnResume, OnSleep Method,並在裡面Call 該頁面的OnAppearing 與 OnDisappearing,然後裡面會再Call BaseViewModel的Virtual Method)
MainPage
public partial class MainPage : BasePage
{
public MainPage()
{
InitializeComponent();
}
}
(繼承 BasePage)
BaseViewModel
public class BaseViewModel : BaseBindable
{
public virtual void OnAppearing()
{
}
public virtual Task OnDisappearing()
{
return Task.FromResult(false);
}
}
(定義OnAppearing 與 OnDisappearing Virtual Method,可讓頁面的ViewModel override)
結論:
這樣就能在App進入背景或前景時,呼叫頁面對應的方法。
參考資料:
http://stackoverflow.com/questions/37266797/how-to-store-app-settings-in-xamarin-forms
https://forums.xamarin.com/discussion/comment/94259/#Comment_94259
文章標籤
全站熱搜
