第 24 章的摘要。 頁面導覽

Download Sample 下載範例

注意

這本書於2016年春季出版,此後一直沒有更新。 這本書中有很多仍然有價值,但一些材料已經過時,有些主題不再完全正確或完整。

許多應用程式是由多頁所組成,使用者在其中流覽。 應用程式一律有 頁面或 首頁 ,而且使用者會從該處流覽至其他頁面,這會在堆疊中維護以供流覽回去。 第 25 章涵蓋 其他導覽選項。頁面品種

VisualElementNavigation 定義 類型的 INavigation屬性,其中包含下列兩種方法以巡覽至新頁面:

這兩種方法 Page 都會接受 實例作為自變數,並傳 Task 回 物件。 下列兩種方法會巡覽回上一頁:

如果使用者介面有自己的 [上一頁 ] 按鈕(如 Android 和 Windows 手機所示),則應用程式不需要呼叫這些方法。

雖然這些方法可從任何 VisualElement取得,但通常是從 Navigation 目前 Page 實例的 屬性呼叫這些方法。

當使用者需要提供頁面上的某些資訊,然後返回上一頁之前,應用程式通常會使用強制回應頁面。 非強制回應的頁面有時稱為無模式或 階層式。 頁面本身中沒有任何內容將其區分為強制回應或無模式;它是由用來巡覽至它的方法所控管。 若要跨所有平台運作,強制回應頁面必須提供自己的使用者介面,才能巡覽回上一頁。

ModelessAndModal 範例可讓您探索無模式頁面與強制回應頁面之間的差異。 任何使用頁面導覽的應用程式都必須將其首頁傳遞至 NavigationPage 建構函式,通常是在程式的 App 類別中。 其中一個獎金是,您不再需要在 iOS 頁面上設定 Padding

您將發現針對無模式頁面,頁面的 Title 屬性隨即顯示。 iOS、Android 和 Windows 平板電腦和桌面平臺都提供使用者介面元素,以巡覽回上一頁。 當然,Android 和 Windows Phone 裝置有標準 [上一頁 ] 按鈕可返回。

對於強制回應頁面,不會顯示頁面 Title ,而且不會提供任何使用者介面元素以返回上一頁。 雖然您可以使用 Android 和 Windows Phone 標準 [上 一頁] 按鈕返回上一頁,但其他平臺上的強制回應頁面必須提供自己的返回機制。

動畫頁面轉換

如果您要頁面轉換以包含動畫,則會提供另一個布林值自變數 true 來提供各種導覽方法的替代版本:

不過,標準頁面導覽方法預設包含動畫,因此這些方法對於在啟動時流覽至特定頁面(如本章結尾討論)或提供您自己的入口動畫時(如 Chapter22 中所述 )才有價值。動畫)。

視覺效果和功能變化

NavigationPage 包含兩個屬性,您可以在方法中 App 具現化 類別時設定:

NavigationPage 也包含四個附加的可系結屬性,這些屬性會影響其設定的特定頁面:

探索機制

頁面導覽方法都是異步的,應該搭配 await使用。 完成並不表示頁面導覽已完成,但只有檢查頁面導覽堆疊是安全的。

當某個頁面巡覽至另一個頁面時,第一頁通常會取得其 OnDisappearing 方法的呼叫,而第二頁則取得其 OnAppearing 方法的呼叫。 同樣地,當某個頁面傳回另一個頁面時,第一頁會取得其 OnDisappearing 方法的呼叫,而第二頁通常會取得其 OnAppearing 方法的呼叫。 這些呼叫的順序(以及叫用導覽的異步方法完成)與平臺相依。 在上述兩個語句中使用 「generally」 一詞是因為 Android 強制回應頁面流覽,因此這些方法呼叫不會發生。

此外,對和 OnDisappearing 方法的呼叫OnAppearing不一定表示頁面流覽。

介面 INavigation 包含兩個集合屬性,可讓您檢查瀏覽堆疊:

最安全的方式是從 的 NavigationPage 屬性存取這些堆疊Navigation(這應該是 App 類別的 MainPage 屬性)。 只有在異步頁面導覽方法完成之後,才可安全地檢查這些堆疊。 的 CurrentPage 屬性 NavigationPage 不會指出目前頁面是否為強制回應頁面,而是表示最後一個無模式頁面。

SinglePageNavigation 範例可讓您探索頁面導覽和堆棧,以及頁面導覽的法律類型:

  • 無模式頁面可以巡覽至另一個無模式頁面或強制回應頁面
  • 強制回應頁面只能巡覽至另一個強制回應頁面

強制執行形式

應用程式需要從使用者取得一些資訊時,會使用強制回應頁面。 除非提供該資訊,否則應禁止使用者返回上一頁。 在 iOS 上,只要使用者完成頁面,就能輕鬆提供 [上一 ] 按鈕並加以啟用。 但針對 Android 和 Windows Phone 裝置,應用程式應該覆寫 OnBackButtonPressed 方法,並在程式已處理 [上一頁] 按鈕本身時傳回 true ,如 ModalEnforcement 範例所示

MvvmEnforcement 範例示範如何在MVVM案例中運作。

如果特定強制回應頁面可以巡覽至多次,它應該保留資訊,讓使用者可以編輯資訊,而不是再次輸入資訊。 您可以藉由保留模式頁面的特定實例來處理此情況,但更好的方法(特別是在 iOS 上)會保留檢視模型中的資訊。

製作導覽功能表

ViewGalleryType 範例示範如何使用 TableView 來列出功能表項。 每個項目都會與 Type 特定頁面的對象相關聯。 選取該專案時,程式會具現化頁面並流覽至該頁面。

Triple screenshot of View Gallery Type

ViewGalleryInst 範例稍有不同,功能表包含每個頁面的實例,而不是類型。 這有助於保留每個頁面的資訊,但所有頁面都必須在程序啟動時具現化。

操作流覽堆疊

StackManipulation 示範由 定義的 INavigation 數個函式,可讓您以結構化的方式操作瀏覽堆棧:

動態頁面產生

BuildAPage 範例示範根據使用者輸入在運行時間建構頁面。

數據傳輸模式

通常需要在頁面之間共享數據 — 將數據傳送至瀏覽的頁面,以及讓頁面將數據傳回叫用的頁面。 有數種技術可以執行這項操作。

建構函式自變數

巡覽至新頁面時,可以具現化頁面類別與可讓頁面初始化本身的建構函式自變數。 SchoolAndStudents 範例會示範這一點。 巡覽頁面也可以讓巡 BindingContext 覽的頁面設定它。

屬性和方法呼叫

其餘數據傳輸範例會探索當某個頁面巡覽至另一頁和返回時,在頁面之間傳遞信息的問題。 在這些討論中,首頁會巡覽至資訊頁面,而且必須將初始化的資訊傳送至資訊頁面。 信息頁面會從使用者取得其他資訊,並將資訊傳送至首頁

首頁一旦具現化該頁面,即可輕鬆地存取資訊頁面中的公用方法和屬性。 信息頁面也可以存取首頁中的公用方法和屬性,但選擇適合這個時機可能很棘手。 DateTransfer1 範例會在其OnDisappearing覆寫中執行這項工作。 其中一個缺點是資訊頁面必須知道首頁的類型

MessagingCenter

類別 Xamarin.FormsMessagingCenter 提供另一種方式,讓兩個頁面彼此通訊。 訊息是由文字字串識別,而且可以伴隨任何物件。

想要接收來自特定型別之訊息的程式必須使用 來訂閱訊息 MessagingCenter.Subscribe ,並指定回呼函式。 稍後可以呼叫 MessagingCenter.Unsubscribe來取消訂閱。 回調函式會接收從指定型別傳送的任何訊息,以及透過 Send 方法傳送的指定名稱。

DateTransfer2 程式示範如何使用傳訊中心傳輸數據,但同樣需要資訊頁面知道首頁的類型

事件

事件是一個類別在不知道該類別類型的情況下,將資訊傳送至另一個類別的時間接受方法。 在 DateTransfer3 範例中資訊類別會定義當資訊就緒時引發的事件。 不過,首頁沒有方便的地方可以中斷事件處理程式的卸離。

App 類別媒介

DateTransfer4 範例示範如何存取首頁和資訊頁面在 類別App定義的屬性。 這是一個很好的解決方案,但下一節會說明更好的內容。

切換至 ViewModel

針對資訊使用 ViewModel 可讓 首頁資訊 頁面共用資訊類別的實例。 這會在 DateTransfer5 範例中示範。

儲存和還原頁面狀態

App應用程式在資訊頁面處於使用中狀態時必須儲存資訊時,類別媒介或 ViewModel 方法就很理想。 DateTransfer6 範例會示範這一點。

儲存和還原瀏覽堆疊

在一般情況下,進入睡眠的多頁程式應該在還原時流覽至相同的頁面。 這表示這類程式應該儲存瀏覽堆疊的內容。 本節說明如何在專為此目的設計的類別中自動執行此程式。 這個類別也會呼叫個別頁面,以允許它們儲存和還原其頁面狀態。

Book.Toolkit 連結Xamarin.Forms庫會定義名為 IPersistantPage 的介面,類別可以實作以儲存和還原字典中的Properties專案。

Book.Toolkit 連結MultiPageRestorableApp庫中的Xamarin.Forms 類別衍生自 。Application 然後,您可以從衍生類別AppMultiPageRestorableApp,並執行一些管家服務。

StackRestoreDemo 示範如何使用 MultiPageRestorableApp

類似真實生活應用程式的內容

NoteTaker 範例也會使用 MultiPageRestorableApp 並允許輸入和編輯儲存在字典中的Properties筆記。