- 資源
- 功能和要求
- 功能實作
- 對week3項目的修改
- 具體實作
- MainPage的實作
- NewPage的改動
資源
資源代碼
項目示範
功能和要求
- (Mainpage.xaml.cs)在MainPage中點選checkbox出現橫線,輸入資料(選擇圖檔),挂起并關閉程式,重新啟動時,程式顯示在Mainpage界面,并且點選的checkbox與對應橫線,資料與圖檔都存在。
- (Newpage.xaml.cs)在NewPage中輸入資料(或選擇圖檔),挂起并關閉程式,重新啟動時,程式顯示在Newpage界面,資料與圖檔都存在。
功能實作
對week3項目的修改
因為week3的部分實作,不滿足week4的設計,是以要對week3修改,主要原因是OnNavigationTo這個函數,第二個參數,在week3傳遞自定義參數到NewPage,但是week4要求儲存現場,沒法序列化自定義的複雜變量,是以将所有變量寫到App.xaml.cs中,采用全局變量的方法,是以無需在頁面中傳值。
public bool issuspend = true;
public string currentId;
public ListItemViewModels ViewModel;
public BitmapImage srcImage;
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
ViewModel = new ListItemViewModels();
}
這樣的改變會造成其他頁面的相應的改變,
public ListItemViewModels ViewModel = ((App) App.Current).ViewModel;
這樣可以不改變MainPage.xaml的綁定書寫,這樣的指派,經測試不是引用,是以應該還要将改動的内容改回App中的ViewModel,我是直接用
((App) App.Current).ViewModel
,是以代碼看起來不太美觀,改動也比較大。
具體實作
MainPage的實作
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
bool suspending = ((App)App.Current).issuspend;
if (suspending)
{
var composite = new ApplicationDataCompositeValue();
composite["Title"] = TitleBlock.Text;
composite["Details"] = DetailBlock.Text;
composite["Date"] = Date.Date;
composite["Visible"] = ((App)App.Current).ViewModel.AllItems[].Completed;
ApplicationData.Current.LocalSettings.Values["MainPage"] = composite;
}
}
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
bool suspending = ((App)App.Current).issuspend;
if (ApplicationData.Current.LocalSettings.Values["TempImage"] != null)
{
StorageFile tempimg;
tempimg = await StorageApplicationPermissions.FutureAccessList.GetFileAsync((string)ApplicationData.Current.LocalSettings.Values["TempImage"]);
IRandomAccessStream ir = await tempimg.OpenAsync(FileAccessMode.Read);
BitmapImage bi = new BitmapImage();
await bi.SetSourceAsync(ir);
NewImage.Source = bi;
ApplicationData.Current.LocalSettings.Values["TempImage"] = null;
}
if (e.NavigationMode == NavigationMode.New)
{
ApplicationData.Current.LocalSettings.Values.Remove("MainPage");
}
else
{
if (ApplicationData.Current.LocalSettings.Values.ContainsKey("MainPage"))
{
var composite = ApplicationData.Current.LocalSettings.Values["MainPage"] as ApplicationDataCompositeValue;
TitleBlock.Text = (string)composite["Title"];
DetailBlock.Text = (string)composite["Details"];
Date.Date = (DateTimeOffset)composite["Date"];
((App)App.Current).ViewModel.AllItems[].Completed = (bool)composite["Visible"];
ApplicationData.Current.LocalSettings.Values.Remove("MainPage");
}
}
}
private async void Select_Click(object sender, RoutedEventArgs e)
{
//檔案選擇器
FileOpenPicker openPicker = new FileOpenPicker();
//選擇視圖模式
openPicker.ViewMode = PickerViewMode.Thumbnail;
//openPicker.ViewMode = PickerViewMode.List;
//初始位置
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
//添加檔案類型
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
ApplicationData.Current.LocalSettings.Values["TempImage"] = StorageApplicationPermissions.FutureAccessList.Add(file);
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
{
var srcImage = new BitmapImage();
await srcImage.SetSourceAsync(stream);
NewImage.Source = srcImage;
}
}
}
加入OnNavigatedFrom和OnNavigatedTo兩個函數
- OnNavigatedFrom作用,是跳轉到其他頁面對MainPage的值做儲存,
這個相當于聲明一個空間,采用鍵值對存儲,但是隻能存儲基本類型,而且容量比較小,是以沒法儲存圖檔形式的值,在Select_Click函數中有改動,var composite = new ApplicationDataCompositeValue();
這句話将file存了起來,在OnNavigateTo中要還原。ApplicationData.Current.LocalSettings.Values["TempImage"] = StorageApplicationPermissions.FutureAccessList.Add(file);
- OnNavigatedTo作用,跳轉到MainPage,還原MainPage,這個用了異步方法,因為要處理圖檔,方法和Select_Click中的方法一樣。
NewPage的改動
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.NavigationMode == NavigationMode.New)
{
ApplicationData.Current.LocalSettings.Values.Remove("NewPage");
}
else
{
if (ApplicationData.Current.LocalSettings.Values.ContainsKey("NewPage"))
{
var composite = ApplicationData.Current.LocalSettings.Values["NewPage"] as ApplicationDataCompositeValue;
TitleBlock.Text = (string)composite["Title2"];
DetailBlock.Text = (string)composite["Details2"];
Date.Date = (DateTimeOffset)composite["Date2"];
ApplicationData.Current.LocalSettings.Values.Remove("NewPage");
}
}
if (((App)App.Current).currentId != "NULL")
{
Create_To_Update();
var temp = false;
ListItem result = new ListItem();
for (int i = ; i < ((App)App.Current).ViewModel.AllItems.Count(); i++)
{
if (((App)App.Current).currentId == ((App)App.Current).ViewModel.AllItems[i].id)
{
result = ((App)App.Current).ViewModel.AllItems[i];
temp = true;
break;
}
}
if (temp == true)
{
TitleBlock.Text = result.title;
DetailBlock.Text = result.description;
Date.Date = result.date;
NewImage.Source = result.src;
}
}
else
{
Update_To_Create();
}
}
protected override void OnNavigatedFrom(NavigationEventArgs e) // 從該頁面離開時
{
bool suspending = ((App)App.Current).issuspend;
if (suspending)
{
var composite = new ApplicationDataCompositeValue();
composite["Title2"] = TitleBlock.Text;
composite["Details2"] = DetailBlock.Text;
composite["Date2"] = Date.Date;
ApplicationData.Current.LocalSettings.Values["NewPage"] = composite;
}
}
和MainPage的改動一緻,沒有做圖檔的處理。