uwp挂起与关闭

资源

资源代码
项目演示

功能和要求

  • (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[0].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[0].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的值做保存,var composite = new ApplicationDataCompositeValue(); 这个相当于声明一个空间,采用键值对存储,但是只能存储基本类型,而且容量比较小,所以没法储存图片形式的值,在Select_Click函数中有改动,ApplicationData.Current.LocalSettings.Values["TempImage"] = StorageApplicationPermissions.FutureAccessList.Add(file); 这句话将file存了起来,在OnNavigateTo中要还原。
  • 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 = 0; 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的改动一致,没有做图片的处理。

猜你喜欢

转载自blog.csdn.net/yaoxh6/article/details/79832100
UWP