XAML in Xamarin.Forms 基礎篇 電子書

XAML in Xamarin.Forms 基礎篇 電子書
XAML in Xamarin.Forms 基礎篇 電子書

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書
顯示具有 Xamarin 標籤的文章。 顯示所有文章
顯示具有 Xamarin 標籤的文章。 顯示所有文章

2019/11/06

Xamarin.Forms 快速上手 與 XAML 使用教學 雙修電子書

Xamarin.Forms 快速上手 與 XAML 使用教學 雙修電子書

更多關於 Xamarin.Forms 開發技術文章,可以參考 這裡

對於已經具備擁有 .NET / C# 開發技能的開發者,可以使用 Xamarin.Forms Toolkit 開發工具,便可以立即開發出可以在 Android / iOS 平台上執行的 App;對於要學習如何使用 Xamarin.Forms & XAML 技能,現在已經推出兩本電子書來幫助大家學這這個開發技術。
這兩本電子書內包含了豐富的逐步開發教學內容與相關觀念、各種練習範例,歡迎各位購買。
Xamarin.Forms 電子書
想要購買 Xamarin.Forms 快速上手 電子書,請點選 這裡
想要購買 XAML in Xamarin.Forms 基礎篇 電子書,請點選 這裡

關於 Xamarin.Forms 快速上手

這是一本帶領 Xamarin.Forms 新手開發者,可以透過書中介紹的各種知識、開發技能,配合練習專案實作,快速地學會使用 Xamarin.Forms 這個 UI Toolkit 來進行跨平台的行動應用裝置之應用程式開發工作。
Xamarin.Forms 快速上手

這本書能提供什麼

在這本書裡面,將會提供 16 章的內容,分別是
  • 開發前的安裝、設定準備工作(共有三章)
    對於 Xamarin.Forms 開發新手,第一個學習卡關將會是如何安裝與設定一個可以進行 Xamarin.Forms 的開發環境;在這個部分將會詳細說明如何安裝與設定 Visual Studio 2019 ,使其可以順利的進行 Xamarin.Forms 的開發工作。
  • 使用 C# 程式語言來直接開發 Xamarin.Forms App
    說明如何僅使用 C# 程式語言,就可以開發出 Xamarin.Forms 的應用程式的開發過程。
  • 使用 XAML 標記宣告語言來開發 Xamarin.Forms App
    說明使用 XAML 宣告標記語言來進行頁面畫面的內容宣告,相關的商業邏輯則是使用 程式碼後置 Code Behind 的方式來開發。
  • 資料綁定 Data Binding
    資料綁定 Data Binding是在 Xamarin.Forms 開發上,最為重要的技術,對於資料綁定的類型共有三種,這裡將會針對一般資料物件類型的綁定設計方式來說明如何使用。
  • 更多資料綁定的用法
    這裡將會繼續介紹更多關於資料綁定的不同使用方式。
  • 數值轉換器 Value Converter
    對於資料綁定的設計方法下,數值轉換器的應用扮演者相當重要的角色,透過設計不同的數值轉換器類別可以設計出許多可重複使用的商業邏輯,並且輕鬆地將不同型別的綁定目標與綁定來源屬性串接在一起。
  • 命令綁定 Command Binding
    命令綁定是資料綁定的第二種類型,透過命令綁定可以不再需要使用以往需要透過事件訂閱的設計方式,與在 程式碼後置 區塊來進行相關商業邏輯的程式碼設計工作,全部都轉移到綁定來源的類別物件上。
  • 事件轉命令行為 Event to Command Behavior
    Xamarin.Forms 並不是所有的檢視項目都有提供可綁定的命令屬性,但是一定會有提供事件觸發的設計方式,在這裡將會使用 Xamarin.Forms 的一個核心技術 行為 Behaviors,將需要訂閱的事件與命令綁定在一起,這使得當事件被觸發的時候,可以執行所綁定的命令內的委派方法。
  • 手勢操作 Gesture Recognizer
    在 Xamarin.Forms 內提供可以與使用者互動的項目不多,按鈕是其中一個,不過, Xamarin.Forms 提供了手勢辨識器功能,可以在讓何檢視項目上,宣告不同的手勢操作行為,當發生了這個手勢操作行為,將會觸發所指定的命令,例如,得知使用者點選了一個圖片 UI 控制項。
  • MVVM Model-View-ViewModel 設計模式
    Xamarin.Forms 可以搭配 MVVM 的設計模式,讓 UI 視覺設計與呈現邏輯程式碼與商業邏輯程式碼分隔開來,這樣可以有助於程式開發流程、進行單元測試,因為,這解除了視覺控制項與程式碼之間的緊密耦合關係。
  • 內建導航服務
    開發行動應用程式最為重要的設計工作,那就是能夠在不同的頁面之間進行切換,在這裡會先進行 Xamarin.Forms 預設提供的導航服務功能進行介紹,並且了解到更多設計上的問題,可能需要進一步的解決。
  • 導航服務之封裝設計
    為了要解決 Xamarin.Forms 預設的導航服務的不足,已經可以在檢視模型中進行各種頁面導航操作,在這裡將會設計一個延伸導航服務類別,解決相關問題,讓開發過程更加的順暢。
  • 相依服務 Dependency Service
    Xamarin.Forms 是個 UI 開發工具,它把 UI 設計抽象化了,並且可以讓使用 Xamarin.Forms 設計的 UI 畫面可以在不同平台下來顯示出來,可是,當需要某些功能一定需要透過原生 SDK API 才能夠運作的需求,並且取得原生 SDK API 的執行結果,這個時候就可以透過 Xamarin.Forms 提供的相依服務來滿足這樣的工作。
  • 訊息中心 MessagingCenter
    訊息中心是一種 發行-訂閱 模式,其中對於 發行者 這個角色可以在不知道任何 訂閱者 的情況下傳送訊息。 同樣地,訂閱者 也可以在不知道任何 發行者 的情況下訂閱特定訊息。透過這樣的特行,可以讓 Xamarin.Forms 的程式順利地執行原生平台下的 SDK API。

誰適合閱讀這本書

本書適合想要學會如何使用 Xamarin.Forms 工具來開發出跨平台的行動應用程式的開發者,這裡將會介紹各種 Xamarin.Forms 核心與應用開發技術與技巧,並且帶領大家了解到進階的開發技能,如:檢視模型定位器,延伸導航服務等。透過學習這些開發技術,將會有助於進行各種 Xamarin.Forms 應用程式開發能力的提升。
不過,讀者本身應該要具備 .NET / C# 的開發經驗與程式寫作技能,並且要有使用過 Visual Studio 2019 開發經驗。
這本書的範例專案將會是在 Windows 10 作業系統下,使用 Visual Studio 2019 開發工具開發出來的,由於使用 Xamarin.Forms 開發出來的專案可以在 Android / iOS / UWP 平台下執行,若想要體驗開發出來的專案且在 iOS 模擬器環境下執行效果,讀者需要額外準備一台 Mac 電腦,並且在這台電腦上需要安裝 Xcode 與 Visual Studio for Mac 開發工具。

如何使用本書

在書中每個章節都設計了一個練習專案,透過逐步說明的方式來帶領讀者來了解到 Xamarin.Forms 專案是如何進行開發的,了解到為什麼需要使用這樣的開發方式與和其他設計方式差異。
本書中的所有講解範例專案都會放在 Github 上,您可以透過 Github 的 Xamarin-Forms-Quick-Start 來取得這些講解範例專案,並且鼓勵大家可以到這個 Xamarin-Forms-Quick-Start Repository 頁面,在螢幕的右上方,點選 Start 按鈕給予鼓勵,如同下圖箭頭所指向地方。

關於 XAML in Xamarin.Forms 基礎篇

XAML in Xamarin.Forms 基礎篇

這本書能提供什麼

在這本書裡面,將會設計 7 大部分
  • 開發前的安裝、設定準備工作
    對於 Xamarin.Forms 開發新手,第一個學習卡關將會是如何安裝與設定一個可以進行 Xamarin.Forms 的開發環境;在這個部分將會詳細說明如何安裝與設定 Visual Studio 2017 ,使其可以順利的進行 Xamarin.Forms 的開發工作,並且也會介紹一個學習 XAML 宣告式標記語言的輔助工具,設計時期預覽工具 大金剛 Gorilla Player 與 執行時期預覽設計工具 LiveXAML,對於如何安裝與使用進行說明。
  • 基本概念
    這個部分將會介紹您學習 XAML 語言必須要先瞭解的各種基本知識與觀念,讓您初步綜覽在學習 XAML 語言比須具備的基本技能。
  • XAML 共用屬性
    我們將說明 XAML 提供的各種類別與其階層關係,這些類別將會被所使用的各種頁面、版面配置、檢視項目所繼承,因此,您可以從這些頁面、版面配置、檢視項目中,使用基底類別所提供的各種屬性、方法與事件。
    這些共用的基底類別包含了: 可綁定物件 BindableObject,項目 Element,視覺項目 VisualElement,頁面 Page,檢視 View,版面配置 Layout
  • 各種不同頁面
    頁面是在 Xamarin.Forms 開發上,最為重要的使用者介面項目,當使用者在開啟此應用程式,第一個畫面內容就是一個頁面;原則上,我們進行 Xamarin.Forms 專案開發,就是要設計出各種不同頁面,並且根據應用程式設計需求,將這些頁面串接起來,提供使用者來操作這些頁面上設計的內容。
    Xamarin.Forms 內提供了這些頁面可供選擇:內容頁面、導航頁面、主從階層頁面、標籤頁面、旋轉木馬頁面。
  • 各種不同版面配置
    我們要把各種 XAML 提供的視覺項目,定位在螢幕上的指定地方,並且可以根據螢幕的大小、解析度、密度來自動調整要顯示出我們所希望的結果,畢竟,要根據不同螢幕的大小、解析度、密度來設計出各種不同的 XAML 文件,這是相當麻煩的,因此,我們將會透過 XAML 中的版面配置來幫助我們自動做到這些事情。
    在 Xamarin.Forms 有提供眾多的版面配置,每個版面配置可以針對不同的設計情境來使用,這包括了:框架、內容檢視、堆疊方式版面配置、格線、捲動檢視、絕對版面配置、鄉對版面配置、彈性方塊版面配置。
  • 各種不同檢視
    檢視是要提供與使用者互動的使用者介面,例如,讓使用者輸入文字、顯示出各種圖片、文字、請使用者選擇指定的日期與時間等等,在這部分將會帶領大家了解這些檢視的功能與使用方式。
  • 各種資料綁定語法
    最後,會針對這本書上各種範例中有用到的資料綁定使用方式,進行完整的歸納與整理,讓您清楚了解如何在 XAML 中正確的使用資料綁定,來幫助您進行各種情境的 Xamarin.Fomrs 應用程式開發。

誰適合閱讀這本書

本書適合想要學會各種 XAML 開發技巧的開發者,將會提供基本 XAML 知識與觀念,不同 XAML 項目的使用與應用的介紹,當然,您還是需要擁有基本的 .NET C# 程式語言的開發經驗。

如何使用本書

在書中除了會提供各種學習 XAML 宣告式標記語言的內容,並搭配不同的應用程式範例進行介紹,從書中的第三部份,將會說明這段內容的講解範例是如何製作出來,希望讀者根據書中的說明步驟,搭配講解內容,逐一自我在電腦前面進行演練,可快速增加學習 XAML 的經驗值。
本書中的所有講解範例專案都會放在 Github 上,您可以透過 Github 的 XAMLInXamarin 來取得這些講解範例專案,並且鼓勵大家可以到這個 XAMLInXamarin Repository 頁面,在螢幕的右上方,點選 Start 按鈕給予鼓勵,如同下圖箭頭所指向地方。
在 XAMLInXamarin 上建立一個 Issue 操作示意圖




2018/08/28

使用 Visual Studio 工具箱 Toolbox 來設計頁面 XAML 語言

使用 Visual Studio 2017 15.8 工具箱 Toolbox 來設計頁面 XAML 語言


了解更多關於 [Xamarin.Android] 的使用方式
了解更多關於 [Xamarin.iOS] 的使用方式
了解更多關於 [Xamarin.Forms] 的使用方式
了解更多關於 [Hello, Android:快速入門] 的使用方式
了解更多關於 [Hello, iOS – 快速入門] 的使用方式
了解更多關於 [Xamarin.Forms 快速入門] 的使用方式

在以往我們進行 Xamarin.Forms 專案開發的時候,我們需要使用 C# 來設計這個行動應用程式的商業邏輯運作行為,對於這個行動應用程式,我們將會透過 XAML 宣告標記語言來設計可用於跨平台的頁面之使用者介面內容。不過,要如何使用這項功能呢,您需要升級 VS4W Visual Studio 2017 for Windows 到 Visual Studio 2017 15.8 版本,並且升級到 Xamarin.Forms NuGet 套件到 3.0 以上的版本。
Xamarin.Forms Toolbar
讓我們使用 Prism Template Pack (2.0.9版本) 來建立一個 Xamarin.Forms 專案
Xamarin.Forms Prism Template Pack
當專案建立完成之後,我們打開 MainPage.xaml 檔案,接著,請打開工具箱視窗,若您找不到工具箱視窗,可以點選 Visual Studio 2017 功能表,點選 [檢視] > [工具箱]。不過,您會很失望,雖然,我這裡的 VS2017 已經升級到 15.8 以上版本,可是,還是看不到關於 Xamarin.Form XAML 的工具箱。
Xamarin.Forms MainPage.xaml
檢查一下您的專案使用的 Xamarin.Forms NuGet 套件,結果發現到 Prism Template Pack 專案樣板建立起來的 Xamarin.Forms 專案,使用的是 2.5.0.122203 版本的 NuGet 套件。
Xamarin.Forms Prism Template Pack
因此,我們需要把整個方案中的所有專案都升級到 Xamarin.Forms 3.0 以上版本的 NuGet 套件,不過,若您只是升級 .NET Standard 專案中的 Xamarin.Forms NuGet 套件到最新版本,您將會得到底下錯誤訊息;所以,記得要把所有方案內的專案,都升級 Xamarin.Forms NuGet 套件到最新版本
Xamarin.Forms NuGet 套件
Xamarin.Forms tasks do not match targets. Please ensure that all projects reference the same version of Xamarin.Forms, and if the error persists, please restart the IDE.    XFToolbar.Android
最後,若您完成了上述動作,您可以切換到 MainPage.xaml 視窗中,打開工具箱視窗,您就會看到了 XAML 可以使用到的各個控制項。您可以點選工具箱中 [Controls] / [Layouts] / [Cells] 的任一項目,拖拉到 XAML 適當地方,Visual Studio 就會幫您產生相關 XAML 語法出來。在這裡,我們從 [工具箱] > [Controls] 拖拉 [Entry] 控制項到右邊的 MainPage.xaml 視窗中的 </StackLayout> 項目前,此時,就會自動產生出 Entry 的 XAML 的語言宣告 <Entry Placeholder="" /> 出來
Xamarin.Forms NuGet 套件

關於 Xamarin 在台灣的學習技術資源

Xamarin 實驗室 粉絲團
歡迎加入 Xamarin 實驗室 粉絲團,在這裡,將會經常性的貼出各種關於 Xamarin / Visual Studio / .NET 的相關消息、文章、技術開發等文件,讓您可以隨時掌握第一手的 Xamarin 方面消息。
Xamarin.Forms @ Taiwan
歡迎加入 Xamarin.Forms @ Taiwan,這是台灣的 Xamarin User Group,若您有任何關於 Xamarin / Visual Studio / .NET 上的問題,都可以在這裡來與各方高手來進行討論、交流。
Xamarin 實驗室 部落格
Xamarin 實驗室 部落格 是作者本身的部落格,這個部落格將會專注於 Xamarin 之跨平台 (Android / iOS / UWP) 方面的各類開技術探討、研究與分享的文章,最重要的是,它是全繁體中文。
Xamarin.Forms 系列課程
Xamarin.Forms 系列課程 想要快速進入到 Xamarin.Forms 的開發領域,學會各種 Xamarin.Forms 跨平台開發技術,例如:MVVM、Prism、Data Binding、各種 頁面 Page / 版面配置 Layout / 控制項 Control 的用法等等,千萬不要錯過這些 Xamarin.Forms 課程

2018/04/27

Xamarin 新手入門 Part 6 我該選擇 Xamarin.Forms 或者 Xamarin 原生方式來開發跨平台應用程式專案呢?



對於已經具備擁有 .NET / C# 開發技能的開發者,可以使用 Xamarin.Forms Toolkit 開發工具,便可以立即開發出可以在 Android / iOS 平台上執行的 App;對於要學習如何使用 Xamarin.Forms & XAML 技能,現在已經推出兩本電子書來幫助大家學這這個開發技術。
這兩本電子書內包含了豐富的逐步開發教學內容與相關觀念、各種練習範例,歡迎各位購買。
Xamarin.Forms 電子書
想要購買 Xamarin.Forms 快速上手 電子書,請點選 這裡

想要購買 XAML in Xamarin.Forms 基礎篇 電子書,請點選 這裡


經過一系列的初步認識 Xamarin 原生方式開發與 Xamarin.Forms 方式開發的方式,大部分第一次接觸 Xamarin Toolkit 工具集的人,都會開始存在著許多問題,我究竟要使用原生方式來進行專案開發,還是要採用 Xamarin.Forms 的方式來進行開發呢?在這篇文章中,將會提供這些相關疑問的解釋說明。

問題:我該選擇原生方式開發還是 Xamarin.Forms 的專案開發

這個需要視您的行動專案應用程式需求而定,當我們選擇了 Xamarin.Forms 形式來進行跨平台專案開發的時候,我們僅需要設計一套 UI 標記宣告與一個商業邏輯的C# 程式代碼,如此,我們就可以同時在 Xamarin.iOS & Xamarin.Android 專案中使用剛剛設計出來的 UI與商業邏輯,根據我這裡實際幫客戶進行專案開發的經驗,一個約採用了50個以上頁面的 Xamarin.Forms 專案,具備了 RESTful Web API 呼叫、推播等機制,共用程式碼的部分可以達到 96% 以上,上下的 4% 僅需要分別在 Xamarin.iOS & Xamarin.Android 原生專案內進行設計,這樣可以大幅提升同時開發兩個平台的應用程式開發效率,而且,最重的是,當應用程式的頁面或者商業邏輯發生了問題,我們也僅需要再 Xamarin.Forms 專案內進行修正,這樣,兩個平台的應用程式經過重新建置之後,就都修復掉了這些問題。
若我們採用原生方式進行開發跨平台應用程式專案, Xamarin.iOS & Xamarin.Android , 此時,關於採用 C# 設計出來的商業邏輯部分,可以分別共用於 Xamarin.iOS & Xamarin.Android 原生專案內,不過,關於 UI 的部分,我們就需要分別在 Xamarin.iOS 原生專案中,使用 Xcode 的 Storyboard 的方式進行設計,這部分可以參考 iOS 使用者介面;而在 Xamarin.Android 原生專案中,需要使用 Android UI XML 的指定語法來定義,這部分可以參考 Android 使用者介面。換言之,您需要分別在這兩個 iOS & Android 原生平台下,精通這兩個平台的 SDK 說明文件,了解如何設計個平台的專屬 UI 頁面。不過,在 Xamarin.Forms 下,您僅需要使用標記宣告的 XAML 語法,來定義出該應用程式頁面所需呈現的 UI/UX 內容,無須了解每個平台專屬 UI 設計知識。
不過,這不代表 Xamarin.Forms 可以適合開發出各種跨平台應用的程式,若您的程式需要存取大量或者深入的原聲平台 API、需要使用到每個平台的專屬原生行為、您的應用程式對於客製化 UI 的需求比起要更多的程式碼分享需求更為迫切,則,您是不適合選擇 Xamarin.Forms 技術來進行跨平台專案開發;例如,您想要開發出虛擬實際 VR / 擴增實境 AR 應用的程式、多媒體影音的應用、需要使用地圖介面,但是要提供更加多的視覺設計,類似寶可夢抓寶那樣的情境、手機遊戲等等,這些情境都不適合選擇採用 Xamarin.Forms 的開發技術。
不過,對於想要在企業內部導入 Xamarin 開發技術,並且開發出相關企業內部想要使用的應用程式、手機購物應用程式等等,這些情境是絕對適合採用 Xamarin.Forms 的技術來進行開發,尤其是企業內部使用的行動應用程式,選擇採用 Xamarin.Forms 是您唯一的選擇,而且是最好的選擇。
最後,在進行專案開發之前,請務必進行分析您的應用程式類型,是否真的適合使用 Xamarin.Forms 方式來進行開發,否則,當您頭髮已經剪好了而且頭洗了一半,這個時候您才想要說,我是要我的頭髮燙成捲髮模式,此時,我的良心建議是,使用 Xamarin 猿聲專案模式進行開發吧,最起碼,您的商業邏輯部分,您不需要重新再寫一次,您僅需要針對每個平台的所有頁面 UI,使用原生 SDK 的說明,重新設計一次即可。

問題:我在 Xamarin.Forms 上進行開發,一定要使用 XAML 嗎?

關於這部分的問題,個人強烈建議要使用 XAML 來進行每個頁面的 UI 設計,並且選擇採用 MVVM 設計模式來進行關注點分離的開發;不過,任何的 XAML 的標記或者宣告,都可以使用 C# 程式語言來進行開發,您當然也可以不需要使用到任何 XAML 技術,自行使用 C# 程式語言來進行開發出 Xamarin.Forms 的跨平台應用程式。
對於 MVVM vs Code Behind 開發方式選擇,個人偏向強烈建議使用 MVVM 方式來進行開發,並且選擇一個好的 MVVM Framework 框架,幫助我們簡化 MVVM 的使用;我都是採用 Prism 這個開發框架,來進行 Xamarin.Forms 的專案設計。當然,青菜蘿蔔各有所好,市面上還有許多相當優異的 MVVM Framework 框架您可以選擇的。
關於更多關於一些 Xamarin.Forms 開發上的疑問,可以參考 Xamarin / Xamarin.Forms 行動跨平台 Mobile Cross-Platform 開發學習指引問答集 FAQ

Xamarin.Forms 的教育訓練課程

在下圖中,我列出了當您在進行 Xamarin.Forms 專案開發的過程中,您需要了解與會遇到的設計情境與需求,您可以挑選則您可能需要、預期的項目,開始進行了解與研究,不過,當您真的實際開始進行 Xamarin.Forms 專案開發的時候,將會遇到這張圖上所遇到的許多項目。
Xamarin.Forms
若您想要選擇使用 Xamarin.Forms 的方式來進行跨平台行動專案的開發,這裡提供幾個關於 Xamarin.Forms 的學習資源與教育訓練課程
  • 開始使用 Xamarin.Forms (微軟官方文件)
    這裡是微軟官方的各種關於 Xamarin.Forms 的說明文件,這裡有著您在使用 Xamarin 工具集進行開發的時候,所需要具備的知識與技能、進階開發技巧、各種說明範例應用,都有著相當豐富的內容。各位可以參考 開始使用 Xamarin.Forms
  • Xamarin.Forms 跨平台行動應用程式開發實戰
    本次課程包含超過4個小時的先修錄影課程、 一堂 1 小時的線上課程 與 五天共 35 小時的實體課程,將會帶領大家快速上手 Xamarin.Forms 開發工具,您將會認識 Xamarin 開發環境,了解使用 Xamarin.Forms 開發工具所會遇到問題與解決方法,學會 XAML 與 MVVM 開發和設計模式,實際動手做出可以跨平台執行的應用程式,並且學會整個 Xamarin.Forms 開發過程。 Xamarin.Forms 跨平台行動應用程式開發實戰
  • Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)
    本次課程包含 1.5 小時的線上課程與1 天實體課程,將會提供已寫好的派工與回報的後台 Web API(包含原始碼),並藉此帶領大家從無到有,開發出跨平台(Android / iOS)行動應用 App。參考網址 Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)
  • Xamarin.Forms 跨平台行動開發一日實戰營(表單 App)
    在整個課程中,將會使用已開發好的 Web API,進行 Xamarin.Forms 跨平台行動應用程式的開發。實作出一個工作日誌回報的表單 App,可以新增、查詢、更新、刪除 (CRUD) 工作記錄、申請請假的表單功能、主管「審核請假」頁面以進行部屬請假紀錄的核准,另外,也會說明如何取得顯示公司緊急連絡方式清單,並且直接進行撥打電話功能。參考網址 Xamarin.Forms 跨平台行動開發一日實戰營(表單 App)
    +

進階研讀


2018/04/01

Part II Xamarin.Forms 的頁面導航 Page Navigation 之有無強制回應 Modal 對話窗和導航工具列 NavigationPage 的體驗

在上一篇 
Xamarin.Forms 的頁面導航Page Navigation 之有無強制回應Modal 對話窗和導航工具列NavigationPage 的體驗
 文章中,當我們使用了 Modal 模式進行導航功能的時候,由於在每個導航過去的頁面,並沒有任何按鈕可以讓我們返回上一頁,因此,當時測試的時候,是在 Android 模擬器下,使用實體回上頁按鈕,使得應用程式可以回上頁;不過,當在 iOS 環境下,並沒有實體回上頁的按鈕,此時就會發生問題。
在這篇文章中,將會延續剛剛提到的文章,繼續來進行探討關於有強制回應 Modal 的導航上的問題,那就是,若我們使用了強制回應 Modal 進行導航到新頁面,不過,該新頁面又有使用了 NavigationPage,這個時候,若我們已經導航過去了,您將會發現,在這個時間點,您是無法使用 _navigationService.GoBackAsync(); 這樣的敘述,讓應用程式回到上一頁,不過,您卻發現到使用了實體回上頁按鈕,卻可以強制回到上頁,對於這樣的問題,我們該如何進行因應呢?
首先,我們需要擴充 
Xamarin.Forms 的頁面導航Page Navigation 之有無強制回應Modal 對話窗和導航工具列NavigationPage 的體驗
 文章中的範例專案程式碼,這個專案程式碼可以 這裡 看到

修正測試專案

在上一篇文章中,若您點選了 [導航到下一頁(有強制回應且有導航頁面)] 倒數第二個按鈕,此時,我們將會使用 _navigationService.NavigateAsync("NavigationPage/Page1Page", null, true); 這樣的敘述,進行頁面導航,不過,我們發現到了,這個時候,我們有在一次使用了 NavigationPage 這個頁面,並且用於此次新的頁面導航中,不過,若我們有再 Page1 頁面中放一個按鈕,當使用按下了這個按鈕,我們就會執行 _navigationService.GoBackAsync(); 這樣的敘述,因此,您將會發現到,按下的這個頁面中的按鈕,卻無法幫助我們回到上一頁,為什麼會有這樣的現象呢?
經過了除錯測試,我們可以確定我們真的有執行了 _navigationService.GoBackAsync(); ,只不過很可惜的,頁面一樣停留在 Page1 中,無法回到主頁面中。
舊的主頁面
現在,我們將這個測試專案修正成為如下截圖內容,其中,我們將原先 [導航到下一頁(有強制回應且有導航頁面)] 這個按鈕,修正名稱成為 [導航到下一頁(有強制回應且有導航頁面)(回上頁按鈕程式碼會失效)],並且另外三個按鈕:[導航到下一頁(有強制回應且有導航頁面)(PopModalAsync)] , [導航到下兩頁(有強制回應且有導航頁面)(逐頁返回)] , [導航到下兩頁(有強制回應且有導航頁面)(全部返回)]
  • 導航到下一頁(有強制回應且有導航頁面)(回上頁按鈕程式碼會失效)
    當按下這個按鈕,將會使用 NavigationPage/Page1Page 這個導航路徑進行頁面導航,也就是 Home -> Page1 (實際上在 Xamarin.Forms 的內部中,紀錄的是 Home -> NavigationPage -> Page1)
  • 導航到下一頁(有強制回應且有導航頁面)(PopModalAsync)
    當按下這個按鈕,將會使用 NavigationPage/Page3Page 這個導航路徑進行頁面導航,也就是 Home -> Page3 (實際上在 Xamarin.Forms 的內部中,紀錄的是 Home -> NavigationPage -> Page3)
  • 導航到下兩頁(有強制回應且有導航頁面)(逐頁返回)
    當按下這個按鈕,將會使用 NavigationPage/Page3Page/Page2Page 這個導航路徑進行頁面導航,也就是 Home -> Page3 -> Page2 (實際上在 Xamarin.Forms 的內部中,紀錄的是 Home -> NavigationPage -> Page1 -> Page2)
  • 導航到下兩頁(有強制回應且有導航頁面)(全部返回)
    當按下這個按鈕,將會使用 NavigationPage/Page3Page/Page4Page 這個導航路徑進行頁面導航,也就是 Home -> Page3 -> Page4 (實際上在 Xamarin.Forms 的內部中,紀錄的是 Home -> NavigationPage -> Page3 -> Page4)
舊的主頁面
另外,我們也追加了兩個新的頁面 Page3, Page4,這兩個頁面與 Page1 , Page2 的差別在於當在這些 ContentPage 頁面中,按下了 Back 按鈕之,前者使用了 PopModalAsync 方法來回上頁,而後者使用了 GoBackAsync 方法來回上頁。

檢視測試結果 導航到下一頁(有強制回應且有導航頁面)(回上頁按鈕程式碼會失效)

當我們導航到了 Page1 (Home -> Page1),並且按下頁面中間的 Back 按鈕,我們發現到這個時候,我們是無法正常回到了首頁;這是因為我們在導航路徑中使用了 NavigationPage 在導航路徑中。
Page1

檢視測試結果 導航到下一頁(有強制回應且有導航頁面)(PopModalAsync)

當我們導航到了 Page1 (Home -> Page3),並且按下頁面中間的 Back 按鈕,現在我們可以正常的回到首頁了,這是因為我們在按下這個按鈕的 DelegateCommand 委派方法中,使用了底下的程式碼,在這裡,我們透過了靜態屬性 App.Current 取得了整個系統的 App 類別的物件,接著,透過 MainPage 屬性,取得正在顯示的頁面物件,如此,我們就可以呼叫 ContentPage 頁面的 Navigation 屬性內的 PopModalAsync 方法,讓系統可以關閉強制回應的頁面。所以,在這樣的設計模式下,不論使用者使用實體退回按鈕或者頁面中的 Back 按鈕,都可以正常回上頁。
會有這樣的結果,這是因為 ContentPage 頁面的 Navigation 屬性是屬於 Xamarin.Forms.INavigation 介面實作,在 Xamarin.Forms.INavigation 介面中,宣告了兩個屬性 ModalStack 與 NavigationStack 。因為我們現在使用了強制回應的導航模式,因此,將會進入到 ModalStack 堆疊內,可能是 Prism 導航服務上有些狀況,無法正常取消強制回應的顯示模式,關於更多關於這方面的內容,可以查看 Prism PageNavigationService 原始碼;因此,我們需要使用 Xamarin.Forms.INavigation.PopModalAsync/) 來關閉強制回應的導航模式。
C# CSharp
GoBackCommand = new DelegateCommand(async () =>
{
    var fooPage = App.Current.MainPage;
    var fooNavigationStack = fooPage.Navigation.NavigationStack;
    var fooModalStack = fooPage.Navigation.ModalStack;
    await fooPage.Navigation.PopModalAsync();
});
Page3

檢視測試結果 導航到下兩頁(有強制回應且有導航頁面)(逐頁返回)

現在,讓我們來測試強制回應的深度導航,當我們導航到了 Page1 (Home -> Page3 -> Page2),我們可以按下在 Page2 頁面中間的 Back 按鈕,此時,該 Back 按鈕會使用 Prism 導航服務來回上頁;現在在 Page3 中,點選頁面中間的 Back 按鈕,該 Back 按鈕會使用關閉強制回應導航模式,並且回到了首頁了。
Page3 > Page4

檢視測試結果 導航到下兩頁(有強制回應且有導航頁面)(全部返回)

現在,讓我們來測試強制回應的深度導航,當我們導航到了 Page1 (Home -> Page3 -> Page4),我們可以按下在 Page4 頁面中間的 Back 按鈕,此時,該 Back 按鈕會使用 關閉強制回應導航模式,也就是會強制關閉這一連串強制回應的深度導航了,並且直接回到了首頁了,因此,您再也看不到 Page3 的顯示內容了。
Page3 > Page4

回顧上篇文章




+