第二十四章:页面导航(五)
導航變化
當您嘗試使用ModalEnforcement和MvvmEnforcement程序時,您可能會對模態頁面未能保留任何信息感到不安。我們都遇到了導航到用于輸入信息的頁面的程序和網站,但是當您離開該頁面然后再返回時,您輸入的所有信息都消失了!這樣的頁面可能非常煩人。
即使在像ModalEnforcement和MvvmEnforcement這樣的簡單演示示例中,也可以通過僅創建模態頁面的單個實例(可能在程序啟動時 - 然后在整個過程中使用該單個實例)來非常輕松地解決該問題。
盡管這種解決方案顯而易見,但它對于保留頁面信息的問題并不是一個很好的通用方法。除最簡單的情況外,應該避免使用這種技術。保持大量頁面處于活動狀態可能會導致內存問題,您必須小心避免在導航堆棧中多次使用相同的頁面實例。
不過,這里是如何修改此技術的ModalEnforcementHomePage代碼隱藏文件:
ModalEnforcementHomePage將ModalEnforcementModalPage的實例保存為字段,然后始終將該單個實例傳遞給PushModalAsync。
在不太簡單的應用程序中,這種技術很容易出錯:有時,應用程序中的特定類型的頁面可以從幾個不同的頁面導航到,這可能會導致兩個單獨的,不一致的ModalPage實例。
如果您需要在程序終止時保存程序的狀態并在程序再次執行時將其還原,則此技術將完全崩潰。您無法自行保存和還原頁面實例。通常是與頁面關聯的數據必須保存。
在現實生活中,ViewModels通常構成多頁面應用程序中頁面類型的主干,而應用程序保留頁面數據的最佳方式是通過ViewModel而不是頁面。
使用MvvmEnforcement可以演示在連續多次調用模式頁面時維護頁面狀態的更好方法。首先,將屬性添加到LittleViewModel的App頁面,并在App構造函數中實例化該類:
由于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程序中首次演示的技術 - 和 然后在應用程序再次啟動時檢索它。
保留數據和在頁面之間傳遞數據的問題將占據本章后面部分的重點。
總結
以上是生活随笔為你收集整理的第二十四章:页面导航(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 缓冲区溢出-基本ROP-ret2sysc
- 下一篇: Eclipse 从git导入maven多