XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書

2018/05/21

如何解決 Your project is not referencing the "MonoAndroid,Version=v8.1" framework 錯誤說明

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

最近將 Surface Pro 4 作業系統重新安裝,並且安裝最新的 Visual Studio 2017 15.7.1 版本,並且透過 Prism Template Pack 來產生一個 Xamarin.Forms 的專案,不過,當想要建置 Android 的專案 (此時,我並沒有進行任何 Xamarin.Forms 的相關設計,只是建立好 Xamarin.Forms 專案),卻得到了底下錯誤訊息。
VS2017 15.7.1 MonoAndroid 8.1 Error
Your project is not referencing the "MonoAndroid,Version=v8.1" framework. 
Add a reference to "MonoAndroid,Version=v8.1" in the "frameworks" section of 
your project.json, and then re-run NuGet restore.
我的另外一台電腦中,在很早之前,就已將安裝了 Visual Studo 2017,不過,這幾天才將 Viusal Studio 2017 從 15.6.x 升級到 15.7.1,不過,我可以確定的是,在我還沒有升級到 VS2017 15.7.1 版本,我是可以順利建立起 Xamarin.Forms 的專案,並且可以順利正常建置該專案。 (有個詭異現象,那就是,這台電腦原本在 15.7.1 版本中,所建立的 Xamarin.Forms 專案,是可以正常建置的,直到昨天晚上,我也沒有做任何升級與安裝相關軟體的動作,卻發生了一樣的問題,卻也會得到一樣的錯誤訊息,無法順利建置成功了)

如何修正這個問題

  • 請在 Visual Studio 2017 的 方案總管中,使用滑鼠雙擊 Android 專案中的 Propertis 節點,找到 應用程式 標籤頁次,並在這個標籤頁次中,您會看到了 使用下列 Android 版本編譯: (目標 Framework) 這個下拉選單,此時他預設的選項是 使用最新平台 (Android 8.1 (Oreo)) Android Properties Application
這個時候,我們先來查看這個 Android 專案的 .csproj 檔案內容,我們看到了,他的 TargetFrameworkVersion 項目標示其值為 v7.1 ,而另外一個標籤 AndroidUseLatestPlatformSdk 該項目的值為 true。
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C6CAF76D-0C7C-4DA4-8DE1-617BF0D573C0}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>BlankApp10.Droid</RootNamespace>
    <AssemblyName>BlankApp10.Android</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkVersion>v7.1</TargetFrameworkVersion>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
    <AndroidStoreUncompressedFileExtensions />
    <MandroidI18n />
    <JavaMaximumHeapSize />
    <JavaOptions />
    <NuGetPackageImportStamp></NuGetPackageImportStamp>
  </PropertyGroup>
  • 請先選擇 目標 Framework 下拉選單為 Android 8.1 (Oreo),我們也觀察,這個時候,Android .csproj 檔案,變成了如下內容
    注意,我們是將原先的 使用最新平台 (Android 8. Oreo) 選項,變更成為第二個 Android 8.1 (Oreo) 選項
    這個時候,他的 TargetFrameworkVersion 項目標示其值為 8.1 ,而另外一個標籤 AndroidUseLatestPlatformSdk 該項目的值為 false。
    Android Properties Application
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C6CAF76D-0C7C-4DA4-8DE1-617BF0D573C0}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>BlankApp10.Droid</RootNamespace>
    <AssemblyName>BlankApp10.Android</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
    <AndroidStoreUncompressedFileExtensions />
    <MandroidI18n />
    <JavaMaximumHeapSize />
    <JavaOptions />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
  </PropertyGroup>
  • 最後,請先選擇 目標 Framework 下拉選單為 使用最新平台 (Android 8. Oreo) 選項,我們也觀察,這個時候,Android .csproj 檔案,變成了如下內容
    這個時候,我們再度將目標 Framework 設定選項,修改成為最初產生專案的設定值,即為 使用最新平台
    現在,我們觀察到,專案中的 .csproj 檔案中, TargetFrameworkVersion 項目標示其值為 8.1 ,而另外一個標籤 AndroidUseLatestPlatformSdk 該項目的值為 true。
    Android Properties Application
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C6CAF76D-0C7C-4DA4-8DE1-617BF0D573C0}</ProjectGuid>
    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>BlankApp10.Droid</RootNamespace>
    <AssemblyName>BlankApp10.Android</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
    <AndroidApplication>True</AndroidApplication>
    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    <AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
    <AndroidStoreUncompressedFileExtensions />
    <MandroidI18n />
    <JavaMaximumHeapSize />
    <JavaOptions />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
  </PropertyGroup>

重新進行建置測試

  • 現在,我們需要重新進行建置動作,為了避免一些雜訊殘留,所以,我們先將這個方案(Solution)進行清除,接著,將 Android 專案與 Xamarin.Forms 專案中的 bin / obj 這兩個目錄,從檔案中刪除掉。
  • 接著,選擇將 Android 專案來建置
  • 稍微等候一段時間,您將會發現到這個 Android 專案,竟然可以順利編譯成功了。
1>------ 已開始建置: 專案: BlankApp10, 組態: Debug Any CPU ------
1>BlankApp10 -> D:\Vulcan\Projects\CannotBuildAndroid\BlankApp10\BlankApp10\BlankApp10\bin\Debug\netstandard2.0\BlankApp10.dll
2>------ 已開始建置: 專案: BlankApp10.Android, 組態: Debug Any CPU ------
2>  BlankApp10.Android -> D:\Vulcan\Projects\CannotBuildAndroid\BlankApp10\BlankApp10\BlankApp10.Android\bin\Debug\BlankApp10.Android.dll
2>  沒有辦法解決 "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 和 "mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" 之間的衝突。任意選擇 "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"。
========== 建置: 2 成功、0 失敗、0 最新、0 略過 ==========
  • 根據從網路上的搜尋與分析,這個問題極有可能是 VS2017 15.7.1 所引發的一個內部 Bug,因此,在尚未取得更新版本的 Visual Studio 2017 前,看樣子,只能夠使用這個方法來進行排除該問題了。

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/25

Xamarin 新手入門 Part 5 Xamarin.Forms for Prism 專案開發教學


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

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

了解更多關於 [Xamarin.Forms 快速入門] 的使用方式

現在,我們可以來觀看我最推薦開發 Xamarin.Forms 應用程式的工具與開發框架,那就是使用 Prism Template Pack 這個 Visual Studio 擴充功能,透過其提供的專案樣板,協助我們可以建立出一個 Prism 可用的開發專案,關於 Prism 的更多資訊,可以參考 Prism on Github
另外,通常我們在進行 Xamarin.Forms 專案開發的時候,會使用 MVVM 設計模式技巧,進行頁面與商業邏輯的設計,同樣的,我們會將頁面要出現的內容,使用 XAML 標記語言進行宣告,而每個頁面的商業處理邏輯程式碼,將會寫在 ViewModel 檢視模型中,在這裡,我們不會將這些商業邏輯使用 Code Behind 的方式寫在每個頁面的後置碼內,會有這樣的考量那是因為,我們不希望把頁面與商業邏輯緊密的綁定在起,這樣對於日後進行專案維護與測試上,會顯得非常不方便,我們要能夠建立頁面與檢視模型之間具有低鬆耦合特性;更多關 MVVM 的資訊,可以參考 第 5 部分 從資料繫結至 MVVM。想要完成這樣的需求,您一定需要精通 資料綁定 Data Binding 這個技術,這樣在開發專案的時候,才能夠得心應手;想要更進一步了解資料綁定的相關內容,可以參考 第 4 部分 資料繫結的基本概念

建立一個 Xamarin Forms for Prism 專案

  • 首先,我們打開 Visual Studio 2017 (任何一種版本 Visual Studio Community 2017 / Visual Studio Professional 2017 / Visual Studio Enterprise 2017皆可)
  • 接著,請安裝 Prism Template Pack 這個擴充功能,
  • 點選 Visual Studio 2017 功能表的 [工具] > [擴充功能和更新]
  • 請在點選 [線上] 標籤頁次,接著在右上方搜尋文字輸入盒中,輸入 Prism
  • 稍後一下,就會看到搜尋結果,請您將 [Prism Template Pack] 這個選項安裝到 Visua Studio 2017 中。
Visual Studio 2017 Extension and Update
  • 一旦您安裝完成 Prism Template Pack,現在可以
  • 點選 Visual Studio 2017 功能表的 [檔案] > [新增] > [專案]
  • 當出現 [新增專案] 對話窗,請依序選擇 [已安裝] > [Visual C#] > [Prism] > [Prism Blank App (Xamarin.Forms)]
  • 請在最下方 [名稱] 文字輸入盒欄位,輸入您想要的專案名稱
  • 最後,請點選 [確定] 按鈕
Visual Studio 2017 Xamarin Forms Prism new project
  • 現在,Visual Studio 2017 將會顯示 [PRISM PROJECT WIZARD] 這個對話窗,您可以在這個對話窗中,選擇需要跨平台的目標,在這裡,您將會有三種選擇: ANDROID, iOS, UWP,請依照您的需求,勾選需要建立的專案類型。接著,請在下方 [Container] 下拉選單中,選擇 Unity 這個選項;最後,請點選 [CREATE PROJECT] 這個按鈕,請 Prism Template Pack 所提供的樣板精靈,幫助我們產生出可用於 Prism 框架的 Xamarin.Forms 方案與專案。
PRISM PROJECT WIZARD
  • 此時,Visual Studio 2017 的 Prism Template Pack 將會開始幫您建立起四個專案(假設我們在上個步驟,勾選的所有平台目標),分別是:
    • Xamarin.Android 原生專案
    • Xamarin.iOS 原生專案
    • Windows UWP 原生專案
    • .NET Standard Class Library SCL 共用類別庫專案
  • 現在,我們可以從 Visual Studio 2017 的方案總管中,看到已經產生了四個專案,如下圖所示,其中,當我們使用 Xamarin.Forms 進行專案開發的時候,原則上大多只會在 SCL 專案上進行程式碼與 XAML 的設計,也就是 .NET Standard Class Library 類別庫內進行程式開發。在 SCL 專案中,我們看到建立了兩個資料夾 [ViewModels] & [Views],我們日後將會在這兩個資料夾來建立頁面的 XAML 標記宣告 (在 Views 資料夾)與每個頁面的商業邏輯(在 ViewModels 資料夾)。
Xamarin.Forms Solution and Projects
  • 現在,請在方案總管中的 SCL 共用類別庫專案內,展開 Views 資料夾,找到 MainPage.xaml 這個節點,使用滑鼠雙擊打開這個檔案;您將會看到這個應用程式頁面的 XAML 標記宣告內容,在這個頁面中,我們僅有宣告顯示一個文字在螢幕上,他將會顯示出 Welcome to Xamarin Forms and Prism! 這個文字。
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XFPQStart.Views.MainPage"
             Title="{Binding Title}">

    <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
        <Label Text="Welcome to Xamarin Forms and Prism!" />
    </StackLayout>

</ContentPage>
  • 現在,請將這個 MainPage.xaml 內容,修改成為如底下所呈現內容。
  • 在這個頁面 XAML 宣告中,我們並沒有使用 x:Name 這個 XAML 延伸標記功能,因為,我們在這個新手練習中,不會使用 Code Behind 來設計相關商業邏輯,我們將會使用資料綁定 Data Binding 的方法,將頁面檢視 (View) 中的 XAML 與檢視模型 (ViewModel) 進行串接再一起,在底下的 XAML 標記宣告中,我們將會綁訂一個 Text 屬性到 ViewModel 中的一個 C# 字串屬性,另外,我們也需要透過資料綁訂 (Data Binding) 來綁定一個 Command 屬性到 ViewModel 中的一個有實作 ICommand 介面 (Interface) 的 DelegateCommand 物件上。
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XFPQStart.Views.MainPage"
             Title="{Binding Title}">

    <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
        <Button
            HorizontalOptions="Center" VerticalOptions="Center"
            Text="{Binding ButtonText}"
            Command="{Binding ButtonCommand}"/>
    </StackLayout>

</ContentPage>
  • 另外,請展開 ViewModels 資料夾,您將會找到 MainPageViewModel.cs 這個節點,使用滑鼠雙擊打開這個節點,在這個檔案內將會有個 MainPageViewModel 類別,也就是我們採用 MVVM 開發模式中的 ViewModel 檢視模型部分,我們會在這裡設計該頁面會用到的各種商業邏輯程式碼。所以,我們使用底下程式碼將其替換,使用具備如同我們前兩個 Android / iOS 練習專案所呈現的相同商業邏輯。
  • 在這裡,我們建立一個 ButtonText C# Property 屬性,這個屬性需要實作 .NET 提供的 INotifyPropertyChanged INPC 介面,如此,資料綁定的機制才能夠成功運作起來,而我們將會透過 Prism 所提供的 ViewModelBase 這個繼承類別內提供的 SetProperty 方法來做到這樣需求;因此,只要我們在 ViewModel 中變更這個屬性值,頁面中的按鈕標示的文字也會變更。另外,我們也建立一個型別為 DelegateCommand 的 ButtonCommand 的物件,搭配按鈕控制項的 Command 屬性,作為使用者點選這個按鈕之後,所要執行的商業邏輯程式碼。
C# CSharp
public class MainPageViewModel : ViewModelBase
{
    private string _ButtonText = "Button";
    public string ButtonText
    {
        get { return _ButtonText; }
        set { SetProperty(ref _ButtonText, value); }
    }
    public int count { get; set; }
    public DelegateCommand ButtonCommand { get; set; }
    public MainPageViewModel(INavigationService navigationService) 
        : base (navigationService)
    {
        Title = "Main Page";

        ButtonCommand = new DelegateCommand(() =>
        {
            ButtonText = string.Format("{0} clicks!", count++);
        });
    }
}

準備進行 Xamarin.Forms for Prism 之 Android 專案的建置、執行、與除錯

  • 請設定 Android 專案為預設起始專案
  • 確認選擇適當的 Android 模擬器
  • 按下 F5 開始執行
Visual Studio for Android Emulator

準備進行 Xamarin.Forms for Prism 之 iOS 專案的建置、執行、與除錯

  • 請設定 iOS 專案為預設起始專案
  • 確認選擇適當的 iOS 模擬器與SDK版本
  • 按下 F5 開始執行
Visual Studio for iOS Simulator

其他參考文章

很多人認為使用 MVVM 開發造成 Xamarin.Forms 開發上的困難度,這就像您喜歡 ASP.NET Web Forms 的開發方式,不喜歡 ASP.NET MVC 開發方式,您就可以直接使用 Web Forms 的方式來開發專案;您喜歡 MVC 的架構來開發您的網站,您就專心研究出如何寫出好的 MVC 架構專案,所謂,青菜蘿蔔各有所好。您可以參考這篇文章 Xamarin.Forms 用 MVVM 開發的好處? Prism 和 cross-platform 開發(優劣)差異? (我發現寫在 ViewModel 內 程式碼要多好多) , Xamarin.Forms MVVM 123 , 我要使用 Code Behind or MVVM ? 會有更多的說明。
另外,在這篇文章中提到使用 Prism 設計框架來幫助我們快速開發出 Xamarin.Forms 應用程式專案,難道沒有其他更好的選擇嗎?我還是那句話,青菜蘿蔔各有所好,挑選您喜歡的 Framework,坐下來,開始進行 Xamarin.Forms 專案開發,才是對的,嘴砲沒有甚麼實質幫助。關於更多其他 MVVM Framework,可以參考 Xamarin Forms and MVVM frameworks part 1: Xamarin Forms’s specific frameworks 與 Xamarin Forms and MVVM frameworks part 2: something else? 和 Should I Use A Xamarin.Forms MVVM Framework? 討論文章吧

進階研讀