XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2016/09/21

使用 iPhone / iPad 實體機進行 Xamarin.Forms 應用程式除錯測試

若想要使用 iPhone / iPad 實體機,在Visual Studio 內進行除錯測試,首先

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

連結測試裝置 (這裡使用 iPad) 與Mac電腦

  1. 請將實體機與 Mac 電腦連線
  2. 在 Mac 電腦上,會出現對話窗 您要允許這部電腦取用 「XXX的 iPad」上的資訊嗎?,如下圖所示,此時,請點選 繼續 按鈕
    MaciTunes.png
  3. 接著會顯示 若要允許取用,請在您的 iPad 上回應 ,此時,請查看您的 iPad 裝置上。
    MaciTunes2
    若在 Mac 電腦上看到了 iTunes 有新版本推出,此時,可以下載並更新
    MaciTunes3
  4. 在 iPad裝置上,可以看到 信任這部電腦 對話窗,請點選 信任 按鈕
    iPad信任裝置

使用 Visual Studio 除錯

  1. 使用 Visual Studio 打開任何已經寫好的 Xamarin.Forms 專案,並且確認 Xamarin Mac Agent 已經設定好與連線成功了
  2. 在工具列上的 方案平台 按鈕上,選取 iPhone,並且有顯示您實體裝置的名稱,最後,按下除錯執行按鈕
    VS與iPad
  3. 這個時候,Visual Studio 會顯示錯誤警告視窗與錯誤訊息 : No installed provisioning profiles match the installed iOS signing identities.
1>------ 已開始建置: 專案: XFSplash.iOS, 組態: Debug iPhone ------
1>  Generated session id: 82df1317d147a2f0be8fc87dd30e508b
1>  Generated build app name: XFSplashiOS
1>  Connecting to Mac server 192.168.1.104...
1>  XFSplash.iOS -> C:\XF-Pages-Samples\XFSplash\XFSplash\XFSplash.iOS\bin\iPhone\Debug\XFSplashiOS.exe
1>C:\Program Files (x86)\MSBuild\Xamarin\iOS\Xamarin.iOS.Common.targets(545,3): error : No installed provisioning profiles match the installed iOS signing identities.
========== 建置: 0 成功、1 失敗、1 最新、0 略過 ==========
========== 部署: 0 成功、0 失敗、0 略過 ==========
發生建置錯誤
  1. 此時,您需要產生一個新的 Provision 設定資訊

取得該裝置的 UDID

  1. 在 Mac 電腦上,開啟 iTunes ,在 iTunes 視窗左上方,找到裝置圖示,如下圖,點選這個圖示
    iTunes
  2. 當您連接的裝置資訊已經顯示在 iTunes 視窗上,請點選 序號 欄位旁的序號值
    iTunes1
  3. 當看到如下圖,顯示出 UDID 與其值的時候,請複製下 UDID 的值
    iTunes2

產生 Provision

  1. 使用瀏覽器進入到這個網址 https://developer.apple.com/account/ios/profile/
  2. 參考 iOS發佈之Mac端的操作,就可以針對實體裝置進行除錯了

2016/09/20

Xamarin.Forms 轉換 PCL Profile 為使用 .NET Standard Library

您需要準備
Visual Studio 2015 Update 3
更新到最新的 Xamarin 穩定版本

開始進行轉換到 .NET Standard Library

  • 請先使用 Visual Studio 2015 Update 3 建立新的 Xamarin.Forms 的專案,請選擇 Blank Xaml App (Xamarin.Forms Portable)
  • 滑鼠雙擊 核心PCL專案內的 Properties,此時,會看到如下圖的截圖;在最下方,可以看到 Target .NET Platform Standard 這個連結,點選這個連結,就會將您的PCL轉換成為使用 .NET Standard Libarary
    XFPCLProperty
    而剛剛產生的核心PCL專案,使用的是 Profile259 類型
    .csproj使用Profile
  • 接著,會看到 Target .NET Platform Standard 這個對話窗,請點選 是(Y) 按鈕
    Target.NETPlatformStandard
  • 不過,似乎 Visual Studio 無法幫您繼續處理這個需求,所以,現在需要將原有已經安裝 NuGet 套件先移除,接著再進行這項轉換工作。
    VisualStudio無法執行

移除所有 NuGet 套件,重新轉換

  • 展開核心PCL專案下的 參考 節點,查看現在有安裝了那些 NuGet 套件,接著使用 管理 NuGet 套件功能,將核心PCL已經安裝好的套件,進行移除
    新XF專案安裝的NuGet
    移除前的管理NuGet套件
  • 滑鼠雙擊 核心PCL專案內的 Properties,此時,會看到如下圖的截圖;在最下方,可以看到 Target .NET Platform Standard 這個連結,點選這個連結,就會將您的PCL轉換成為使用 .NET Standard Libarary;當看到對話窗出現,請點選 是(Y) 按鈕。
    XFPCLProperty
  • 此時,您會看到這個 PCL專案已經從使用 Profile 為基礎類型,轉換成為使用 .NET Standard Library;若您底選下方的 Target Portable Class Library Porfile 連結,則會切回到最初使用 Profile 為基礎的類型。
    已經轉換成為netstand
    .csproj使用netstand

安裝回原有 NuGet 套件

  • 當您使用 管理 NuGet 套件 套件要安裝原有 Xamarin.Forms 的 NuGet 套件,卻無法安裝,會有這樣錯誤訊息:封裝還原失敗。正在復原 'App2' 的寺裝變更。
  • 請打開 project.json 檔案,加入 imports 內容,修正如下內容並且儲存這個檔案
{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },
  "frameworks": {
    "netstandard1.3": {
      "imports": [
        "portable-net45+win8+wpa81+wp8"
      ]
    }
  }
}
  • 請重新使用 管理 NuGet 套件 功能,加入 Xamarin.Forms 套件
  • 安裝完成之後,您就可以開始執行囉

參考資料

Xamarin.Forms 在 PCL 中,判斷是否在除錯模式

在開發 PCL 專案內的程式碼,是無法使用任何 條件編譯式符號 ,要了解決這個問題,可以定義一個介面,並且在每個平台實作這個介面,最後,透過 Prism 的 Unity 的建構式注入方式,取得這個介面實作物件
  1. 在 PCL 中定義這個介面,這個介面僅有定義一個方法,回傳現在是否在除錯模式下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace XFDoggy.Infrastructure
{
    public interface IDebugMode
    {
        bool IsDebugMode();
    }
}
  1. 在 Android 專案中,實作這個介面
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using XFDoggy.Infrastructure;
using XFDoggy.Droid.Infrastructure;


[assembly: Xamarin.Forms.Dependency(typeof(DebugMode))]
namespace XFDoggy.Droid.Infrastructure
{
    public class DebugMode : IDebugMode
    {
        public bool IsDebugMode()
        {
#if DEBUG
            return true;
#else
            return false;
#endif
        }
    }
}
  1. 在 iOS & UWP 專案,如同上述 Android 程式碼,實作這個介面
  2. 回到 核心PCL專案中,使用建構式注入這個物件,並且判斷現在是否在除錯模式
        public LoginPageViewModel(INavigationService navigationService, IPageDialogService dialogService,
            IDebugMode debugMode)
        {
            _navigationService = navigationService;
            _debugMode = debugMode;
            _dialogService = dialogService;

            if (_debugMode.IsDebugMode() == true)
            {
                Account = "XXX";
                Password = "???";
            }
        }

2016/09/19

Xamarin.Forms Android發佈APK 適用於 Xamarin Android 7.0

在您開發完成 Xamarin.Android 應用程式之後,您需要產生一個Android應用程式套件,簡稱 APK (Android application packages) 檔案,這個檔案的副檔名是 .apk。其實就是一個壓縮 ZIP 檔案,您可以使用任何 ZIP 解壓縮軟體,既可以開啟查看這個檔案內包含了那些檔案。在這個 APK 壓縮檔案內,將會與 Android 套件內的架構與內容都一樣,不過,因為是透過 Xamarin.Android 開發出來的 APK,這還會包含一個資料夾assemblies ,裡面存放了 .NET 組件 (Assembly)與包含 Mono 執行時期的原生程式庫也會在這個 APK 內。
當您需要進行提交該應用程式到 Google Play 內或者想要進行內部 Beta 測試或者佈署到企業內部內使用,您都需要先產生這個 APK 檔案,為了要確保 APK 的資料完整性與沒有被其他人竄改,所以,您需要對這個 APK 進行數位簽名的動作,在簽名之前,您需要打造或者擁有一把您自己的金鑰,做為日後識別這個 APK 檔案確實是由您包裝出來的,而且內容沒有被串改過。
底下文章將會說明如何產生這個 APK 檔案與打造一把自己用於數位簽名的金鑰或者使用之前打造過的金鑰。
這篇筆記的操作內容,僅僅適用於 Xamarin Android 7.0 以後的版本,要如何檢查您的 Visual Studio 內的環境是甚麼 Xamarin Android 版本,請在 Visual Studio 的功能表,點選 說明 > 關於 Microsoft Visual Studio;就會看到如下圖畫面,此時,您會看到這台電腦上的 Xamarin Android 安裝的是 7.0.0.18 版本。
關於XamarinAndroid版本
當您在使用 Xamarin.Android 來進行 Xamarin.Forms 應用程式的除錯,Xamarin.Android 使用內建預設的金鑰褲來進行您的除錯版本程式的簽名,這個檔案位於:
C:\Users\%USERNAME%\AppData\Local\Xamarin\Mono for Android\debug.keystore

產生 APK & 使用程式碼簽名新的金鑰

  1. 請先設定 Android 的原生專案變成 設定為起始專案
  2. 滑鼠右擊 Android 的原生專案,選擇 Archive
    XA_Archive
  3. 此時,會出現 Archive Manager,點選要產生 APK 的檔案項目,接著點選下方的 [Distribute] 按鈕
    ArchiveManager
  4. 出現另外一個畫面,Distribute 對話窗,若您尚未建立自己的簽名金鑰,請點選下方的 + 按鈕
    DistributieApp視窗
    這個時候,出現了 Android Key Store 對話窗,請填寫這些基本資料,建議所有欄位都要填寫,最後按下 Create 按鈕,您的金鑰就產生好了。
    您建立的金鑰將會產生在這個目錄之下,請記得要將您自己產生的金鑰複製保存好
    C:\Users\%USERNAME%\AppData\Local\Xamarin\Mono for Android\Keystore
    AndroidKeyStore
  5. 回到 Distribute 對話窗,點選要進行簽名的金鑰,接著點選 Save As 按鈕,選擇要輸出的 APK 檔案路徑。
  6. 最後,會回到 Archive Manager 視窗,您可以點選 Open Distribution 按鈕,您就會看到剛剛產生且已經簽名過的 APK 檔案;若您要取得尚未簽名的 APK 檔案,請記得要點選 Open Folder 按鈕,就會看到了。

2016/09/18

Xamarin.Forms XAML 的開發除錯技巧

當在進行 Xamarin.Forms 專案開發的時候,因為現階段 Visual Studio 的 Xamarin.Fomrs 對於 XAML 的編輯器支援程度不如 UWP 或者 WPF 的好用,因此,在開發除錯執行階段,往往會看到這樣的錯誤訊息:System.NullReferenceException: Object reference not set to an instance of an object.。而到底是哪裡發生了問題,也很難找出問題所在,現階段比較好的方法就是使用刪去法。
不過,當您切換起始專案到 UWP 專案之後,就會發現到真正 XAML 上的錯誤問題在哪裡,以及真正的原因是甚麼?

XAML 中的語法錯誤

在底下的 XAML 宣告一個 ListView 控制項,其中資料來源是由 MyItemList 資料綁定而來,而使用者選取的紀錄,將會綁定到 MyItemListSelected 屬性上。
    <ListView
      ItemsSource="{Binding MyItemList}"
      ItemSelected="{Binding MyItemListSelected}"
      />
乍看這樣的宣告似乎沒有甚麼問題,一旦當 Android 平台下執行的時候,就會發現到這樣的錯誤畫面
UnhandledExceptionXAML
為什麼會發生這樣的問題呢? 這是因為 ItemSelected 這是一個 ListView 的事件
不過,當切換到 UWP 開發環境下執行同樣的程式碼,會得到底下的訊息與畫面
'Xamarin.Forms.Xaml.XamlParseException' 類型的例外狀況發生於 Xamarin.Forms.Xaml.dll,但使用者程式碼未加以處理

其他資訊: Position 13:7. No Property of name ItemSelected found
XAMLParseException
其中,訊息: Position 13:7. No Property of name ItemSelected found 明確的說明了問題所在地點與內容,讓我們來對照原始 XAML 定義檔內容
XAML發生錯誤原始內容
您可以看到在13行的第7個位置,指的就是 ItemSelected,而根據錯誤訊息內容,那就使用錯誤的 XAML 屬性名稱,應該使要使用 SelectedItem 這個屬性。

2016/09/17

Visual Studio 自訂程式碼片段 Code Snippet

自訂程式碼片段 Code Snippet 在 Visual Studio 內,是相當好用一項功能,您可以將常用的片段程式碼做成一個類似巨集的功能,當您要寫這段程式碼的時候,便可以快速地取出這些定義好的程式碼片段,變更相關變數之後,立即就完成了程式碼寫作。
在這裡,將會記錄如何將經常在 MVVM 架構下,要在 ViewModel 內定義一個屬性,且可以呼叫 PropertyChanged 的作法,這段需要製作成為程式碼片段的程式碼為:
        #region DataField01
        private string m_DataField01 = string.Empty;
        /// <summary>
        /// 清單資料夾編號
        /// </summary>
        public string DataField01
        {
            get { return this.m_DataField01; }
            set { this.SetProperty(ref this.m_DataField01, value); }
        }
        #endregion
  1. 首先,需要在 Visual Studio 內安裝 Snippet Designer 這個擴充套件。請點選 工具 > 擴充功能與更新,搜尋 Snippet Designer 這個套件,安裝起來。
    Snippet Designer
  2. 在 Visual Studio 程式碼編輯器視窗中,框選一段您將成會用到的程式碼,並且在框選出來的程式碼上,使用滑鼠右擊,在彈出功能表上選擇 Export as Snippet
    ExportAsSnippet
  3. 在 Snippet Designer 編輯視窗中,滑鼠右擊、選取您要取代的程式碼內容,接者選擇 Make Replacement項目,接著在底下 Replacements 清單內,設定這個可替換變數的定義資訊。
    CodeSnippetEditor
  4. 請在屬性視窗內,設定
    • Snippet Kind 為 MethodDecl
    • Description 為 這個程式碼片段的介紹與目的
    • Shortcut 為 可以快速呼叫這個程式碼片段的指令
    CodeSnippetEditor屬性
  5. 設定完成後,請儲存這個程式碼片段到某個資料夾內
  6. 點選 工具 > 程式碼片段管理員,點選加入按鈕,選擇剛剛儲存的資料夾,此時,您就可以開始使用這個新設定的程式碼片段了。

修改舊的程式碼片段

  1. 點選 檢視 > 其他視窗 > Snippet Explorer
  2. 輸入您要修改的程式碼片段 Shortcut 名稱,接著點選 Search按鈕
  3. 在搜尋出來的結果,滑鼠右擊要編輯的項目,點選 Open 選項,就可以編輯了
    SnippetExplorer