第二十四章:页面导航(五)

简介: 导航变化当您尝试使用ModalEnforcement和MvvmEnforcement程序时,您可能会对模态页面未能保留任何信息感到不安。我们都遇到了导航到用于输入信息的页面的程序和网站,但是当您离开该页面然后再返回时,您输入的所有信息都消失了!这样的页面可能非常烦人。

导航变化

当您尝试使用ModalEnforcement和MvvmEnforcement程序时,您可能会对模态页面未能保留任何信息感到不安。我们都遇到了导航到用于输入信息的页面的程序和网站,但是当您离开该页面然后再返回时,您输入的所有信息都消失了!这样的页面可能非常烦人。
即使在像ModalEnforcement和MvvmEnforcement这样的简单演示示例中,也可以通过仅创建模态页面的单个实例(可能在程序启动时 - 然后在整个过程中使用该单个实例)来非常轻松地解决该问题。
尽管这种解决方案显而易见,但它对于保留页面信息的问题并不是一个很好的通用方法。除最简单的情况外,应该避免使用这种技术。保持大量页面处于活动状态可能会导致内存问题,您必须小心避免在导航堆栈中多次使用相同的页面实例。
不过,这里是如何修改此技术的ModalEnforcementHomePage代码隐藏文件:

public partial class ModalEnforcementHomePage : ContentPage
{
    ModalEnforcementModalPage modalPage = new ModalEnforcementModalPage();
    public ModalEnforcementHomePage()
    {
        InitializeComponent();
    }
    async void OnGoToButtonClicked(object sender, EventArgs args)
    {
        await Navigation.PushModalAsync(modalPage);
    }
}

ModalEnforcementHomePage将ModalEnforcementModalPage的实例保存为字段,然后始终将该单个实例传递给PushModalAsync。
在不太简单的应用程序中,这种技术很容易出错:有时,应用程序中的特定类型的页面可以从几个不同的页面导航到,这可能会导致两个单独的,不一致的ModalPage实例。
如果您需要在程序终止时保存程序的状态并在程序再次执行时将其还原,则此技术将完全崩溃。您无法自行保存和还原页面实例。通常是与页面关联的数据必须保存。
在现实生活中,ViewModels通常构成多页面应用程序中页面类型的主干,而应用程序保留页面数据的最佳方式是通过ViewModel而不是页面。
使用MvvmEnforcement可以演示在连续多次调用模式页面时维护页面状态的更好方法。首先,将属性添加到LittleViewModel的App页面,并在App构造函数中实例化该类:

namespace MvvmEnforcement
{
    public class App : Application
    {
        public App()
        {
            ModalPageViewModel = new LittleViewModel();
            MainPage = new NavigationPage(new MvvmEnforcementHomePage());
        }
        public LittleViewModel ModalPageViewModel { private set; get; }
    __
    }
}

由于LittleViewModel仅实例化一次,因此它会在应用程序的持续时间内维护信息。 然后,MvvmEnforcementModalPage的每个新实例都可以简单地访问此属性并将ViewModel对象设置为其BindingContext:

public partial class MvvmEnforcementModalPage : ContentPage
{
    public MvvmEnforcementModalPage()
    {
        InitializeComponent();
        LittleViewModel viewModel = ((App)Application.Current).ModalPageViewModel;
        BindingContext = viewModel;
        // Populate Picker Items list.
        foreach (string language in viewModel.Languages)
        {
            picker.Items.Add(language);
        }
    }
    __
}

当然,一旦程序终止,信息就会丢失,但App类也可以将这些信息保存在Application的Properties属性中 - 这是第6章“按钮点击”结束时PersistentKeypad程序中首次演示的技术 - 和 然后在应用程序再次启动时检索它。
保留数据和在页面之间传递数据的问题将占据本章后面部分的重点。

目录
相关文章
|
7月前
|
小程序 API
【微信小程序】-- 页面导航 -- 声明式导航(二十二)
【微信小程序】-- 页面导航 -- 声明式导航(二十二)
|
Android开发 索引 iOS开发
第二十四章:页面导航(十七)
像现实生活中的应用程序理想情况下,用户在终止并重新启动应用程序时不应该知道。应用程序体验应该是连续且无缝的。即使程序没有一直运行,一个半月进入的条目从未完成也应该在一周后处于相同的状态。NoteTaker程序允许用户记录由标题和一些文本组成的注释。
548 0
|
XML JSON Android开发
第二十四章:页面导航(十五)
保存和恢复页面状态特别是当您开始使用多页面应用程序时,将应用程序的页面视为数据的主要存储库非常有用,而仅仅是作为底层数据的临时可视化和交互式视图。这里的关键词是暂时的。如果您在用户与之交互时保持基础数据是最新的,那么页面可以显示和消失而不必担心。
656 0
|
JavaScript 前端开发 Android开发
第二十四章:页面导航(十六)
保存和恢复导航堆栈 许多多页面应用程序的页面体系结构比DataTransfer6更复杂,您需要一种通用的方法来保存和恢复整个导航堆栈。此外,您可能希望将导航堆栈的保存与系统方式集成,以保存和恢复每个页面的状态,特别是如果您不使用MVVM。
499 0
|
JavaScript Android开发
第二十四章:页面导航(十四)
切换到ViewModel此时应该很明显,Information类应该真正实现INotifyPropertyChanged。 在DataTransfer5中,Information类已成为InformationViewModel类。
606 0
|
JavaScript Android开发 索引
第二十四章:页面导航(十)
属性和方法调用调用PushAsync或PushModalAsync的页面显然可以直接访问它导航到的类,因此它可以设置属性或调用该页面对象中的方法以将信息传递给它。但是,调用PopAsync或PopModalAsync的页面还有一些工作要做,以确定它返回的页面。
555 0
|
JavaScript Android开发 索引
第二十四章:页面导航(十三)
App类中介在Xamarin.Forms应用程序中,在公共代码项目中执行的第一个代码是通常名为App的类的构造函数,该类派生自Application。 在程序终止之前,此App对象保持不变,并且程序中的任何代码都可以通过静态Application.Current属性使用它。
516 0
|
JavaScript Android开发
第二十四章:页面导航(九)
数据传输模式 多页面应用程序中的页面通常需要共享数据,特别是一页面将信息传递到另一页面。 有时此过程类似于函数调用:当HomePage显示项目列表并导航到DetailPage以显示其中一个项目的详细视图时,HomePage必须将该特定项目传递给DetailPage。
636 0
|
Android开发
第二十四章:页面导航(八)
动态页面生成BuildAPage程序是一个多页面应用程序,但BuildAPage项目只包含一个名为BuildAPageHomePage的页面类。 顾名思义,该程序从代码构造一个新页面,然后导航到它。XAML文件允许您在此构造的页面上指定所需内容: <ContentPage xmlns="http://xamarin.
674 0