XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2017/01/24

Xamarin FAQ 1-23 : 進行 iOS 專案除錯,得到 No installed provisioning profiles match the installed iOS signing identities.

問題

若您開發完成 Xamarin.Froms 專案,並且於 Android 平台下測試過,接著,您想要在 iOS 平台下執行這個應用程式,看看有沒有甚麼問題;當然,您會使用滑鼠右擊 iOS 原生專案,選擇 設定為起始專案,接著,二話不說,馬上建置這個 iOS 專案,很不幸的,您得到了這個錯誤訊息
No installed provisioning profiles match the installed iOS signing identities.
那麼,您該如何解決此一問題呢?

解答

請您確認 Visual Studio 2015 中的標準工具列上,關於 方案平台 的選項,是否為 iPhoneSimulator,若不是,請切換下拉選單,選擇 iPhoneSimulator 這個選項,接著,重新建置一次,就沒問題了。

2017/01/23

Xamarin FAQ 1-22 : 為什麼在核心 PCL 專案內無法使用 HttpClient 這個類別呢?

問題

當您需要在 Xamarin.Forms 專案中,提供可以存取 Web API 的功能,當然,應該要使用 .NET 提供的 HttpClient 類別所產生的物件,就可以進行相關 Get / Post / Put / Delete 等 RESTful 操作,並且這個類別是提供了非同步方法來呼叫,不會造成使用者操作介面被凍結的問題;不過,若您在核心 PCL 專案內取使用 HttpClient 這個類別,卻發現到您是無法參考到這個物件,那麼,該如何解決此一問題呢?

解答

要解決此一問題,請在方案中滑鼠右擊,選擇 管理方案的 NuGET 套件 > 瀏覽 ,請在搜尋文字輸入盒中,輸入 Microsoft.Net.Http 這個套件名稱,接著,將這個套件安裝到所有的專案內。這個安裝動作除了會幫助您安裝 Microsoft.Net.Http 套件,還會幫助您安裝其他相依性 NuGet 套件,Microsoft.Bcl / Microsoft.Bcl.Build / Microsoft.NETCore.UniversalWindowsPlatform

2017/01/22

Xamarin FAQ 1-21 : 關於 Android 的自動加入權限設定問題

問題

當在進行行動裝置應用程式開發的時候,若您的應用程式需要使用到裝置中的硬體等相關功能,此時,您需要手動修改 AndroidManifest.xml 檔案,並且,您需要知道這些權限的名稱並且填入到這個檔案內,有沒有甚麼更加簡單的方法來處理這樣的問題。

解答

  • 您可以打開 Android 原生專案內的內容,在 Android 原生專案中,說擊 Properties 這個節點,並且找到 Android Manifest 葉面,您將會看到下方有 Required permissions 清單,您可以在這裡勾選您需要用到的權限。
  • 現在,越來越多的 Xamarin.Forms 套件,當您加入到 Xamarin.Forms 專案內後,一旦您建置 Release 模式的 APK 檔案,這些套件會用到的權限便會自動加入到 AndroidManifest.xml 檔案內。若您擔心是否需要用到的權限是否有加入到 AndroidManifest.xml 檔案內,可以參考底下的說明:
    假設這個專案是 XFTakePhoto,您可以打開這個專案下的目錄 XFTakePhoto\XFTakePhoto\XFTakePhoto.Droid\obj\Release\android 查看這個檔案 AndroidManifest.xml
    您將會看到這個拍照應用程式,自動加入了這些權限 android.permission.INTERNET / android.permission.WRITE_EXTERNAL_STORAGE / android.permission.READ_EXTERNAL_STORAGE / android.hardware.camera / android.hardware.camera.autofocus
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="XFTakePhoto.Droid" android:versionCode="1" android:versionName="1">
  <!--suppress UsesMinSdkAttributes-->
  <uses-sdk android:minSdkVersion="19" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.camera" android:required="false" />
  <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
  <application android:label="XFTakePhoto.Droid" android:theme="@style/MyTheme" android:icon="@drawable/icon" android:name="md5a568f8c57b5f8a80d01f31a0c4f56c56.MainApplication" android:allowBackup="true">
    <activity android:configChanges="orientation|screenSize" android:icon="@drawable/icon" android:label="XFTakePhoto" android:name="md5a568f8c57b5f8a80d01f31a0c4f56c56.MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:configChanges="orientation|screenSize" android:name="md5a3e164e78ade0c22cefea770ddd0bc49.MediaPickerActivity" />
    <provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="XFTakePhoto.Droid.mono.MonoRuntimeProvider.__mono_init__" />
  </application>
</manifest>

2017/01/21

Xamarin FAQ 1-20 : 如何在建置時期,就能夠發現到 XAML 語法上的錯誤

問題

原則上,當 Xamarin.Forms 應用程式在執行並且顯示一個頁面的時候,會動態的載入與分析 XAML 宣告標記檔案,並且產生出相關 .NET 物件,最後將這個頁面顯示在手機螢幕上;所以,若 XAML 的宣告標記內容若有任何錯誤,必須要等到執行時期才會發現到,當然,這個時候,您的應用程式就會造成閃退的現象,這對於使用者而言,並不是一個很好的體驗,那麼,要如何處理,才能夠讓 Visual Studio 可以在建置時期的時候,就能夠指出 XAML 檔案哪裡寫得有問題,並且可以提升整體應用程式的執行效能。

解答

請在您的核心 PCL 專案內,找到 Properties 節點,並且展開這個節點,此時,您會看到有個項目,AssemblyInfo.cs 檔案,使用滑鼠雙擊這個檔案,請在這個檔案的最後,加入底下程式碼。
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]

2017/01/20

Xamarin FAQ 1-19 : 如何製作類似 HTML 可連結文字標籤

問題

在 Xamarin.Forms 所提供的預設控制項中,並沒有看到類似 HTLM 可連結文字標籤效果的控制項,而且,從 Label 控制項中,也看不到有任何 點擊 Tap / Click 相關的事件可以使用;若想要在 Xamarin.Forms 的頁面中開發出這樣的控制項效果,是不是只能夠透過 Renderer 的方式來實現呢?

解答

其實,關於這樣的需求,不需要透過 Renderer 就可以做到;在每個控制項中,都會擁有一個 GestureRecognizers 屬性,您可以透過這個屬性,加入想要的手勢操作 XAML 物件,就可以偵測出使用者是否有點擊這個 Label 標籤控制項了。
以底下的 XAML 宣告標籤而言,我們在 Label.GestureRecognizers 屬性內,加入了一個 TapGestureRecognizer 物件,並且使用了 Command 屬性綁定了檢視模型 ViewModel 內的一個 ICommand的屬性,如此,您就可以在這個 ICommand 中來定義,當使用者點擊了這個文字標籤之後,需要做哪些相關的處理動作。
            <Label 
                Grid.Column="0"
                HorizontalOptions="Center" VerticalOptions="Center"
                Text="查看明細"
                TextColor="Blue"
                FontSize="14"
                   >
                <Label.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding 查看明細Command}"/>
                </Label.GestureRecognizers>
            </Label>

2017/01/19

Xamarin FAQ 1-18 : 如何在 XAML 中,參考其他的控制項

問題

在進行 XAML 頁面設計的時候,如何在某個控制項中的某個屬性,是參考來自於另外一個控制項的某個屬性,這該如何定義這樣的 XAML 宣告標記呢?

解答

以底下的 XAML 範例中,若您要參考某個控制項,您必須要先使用 x:Name 這個延伸宣告標記,定義這個控制項的可以存取名稱,當然,也可以在 Call behind 程式碼中,使用這個定義名稱,來存取這個控制項。
接著,您需要使用 x:Reference 這個延伸宣告標記,指出要參考的其他控制項,在底下範例中,第二個 Label 控制項的 Text 屬性,透過了指定另外一個控制項做為資料繫結的來源,並且指定了參考路徑指向 label這個控制項的 Text 屬性。
        <Label x:Name="label" Text="{Binding Title}" />
        <Label Text="{Binding Source={x:Reference label}, Path=Text}"/>

2017/01/18

Xamarin FAQ 1-17 : 如何在 XAML 中,使用與存取 .NET 靜態屬性

問題

當您想要使用 .NET 的靜態屬性,來集中管理 XAML 中會參考到的物件,那麼,在 XAML 中,是要如何參考這個 .NET 中的靜態屬性值呢?

解答

  • 首先,您需要在 .NET 中,定義一個靜態類別,和裡面的靜態屬性。
  • 在 XAML 裡面,為了要能夠參考到這個 .NET 中的靜態屬性,您需要宣告一個新的命名空間 ( namespace )。
    在底下的範例中,使用了 xmlns 這個關鍵字,宣告了一個新的命名空間 xmlns:local="clr-namespace:App1" 叫做 local。
    當您要參考這個新的命名空間內了某個靜態屬性,例如,Label 這個控制項的 Font 這個屬性,它的字體大小值需要參考到 .NET 靜態屬性 AppConstants.TitleFont,這個時候,您可以使用 x:Static這個延伸擴充標記來參考其他物件屬性。
    Font="{x:Static local:AppConstants.TitleFont}" 在這個範例中,使用了 x:Static 配合了指定 AppConstants.TitleFont屬性值,是定義在 local 命名空間。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App1"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             x:Class="App1.MainPage">

  <Label Text="Hello, XAML!"
         VerticalOptions="{x:Static LayoutOptions.Start}"
         HorizontalTextAlignment="{x:Static TextAlignment.Center}"
         TextColor="{x:Static Color.Aqua}"
         BackgroundColor="{x:Static local:AppConstants.ForegroundColor}"
         Font="{x:Static local:AppConstants.TitleFont}"
         />
</ContentPage>

2017/01/17

Xamarin FAQ 1-16 : 如何在 XAML 中,使用與存取靜態資源

問題

當我們在進行宣告 XAML 個控制項標記屬性的時候,希望能夠擁有 CSS 這樣特性的功能,也就是可以把許多共同屬性的設定值,例如,顏色設定,集中定義在某個地方,這樣,就可以在 XAML 內的各個控制項參考這個顏色宣告。如此,當要變更這些參考到的控制項的顏色,就可以直接修改這個宣告顏色的地方進行修改,但是,要怎麼做到這樣的功能呢?

解答

要了要簡化與集中管理 XAML 中各控制項的屬性設定,您可以在 ContentPage 內的 Resources 屬性內,定義 ResourceDictionary,在 ResourceDictionary裡面,您可以透過 XAML 標記來宣告產生一些物件,讓整個頁面可以相關控制項與版面控制可以參考這個物件。
在底下的範例中,我們在 ResourceDictionary 內,宣告了一個 lSize 的物件,它的型態為 x:Double (也就是 .NET 裡面的 double 型別),並且設定其值為 30。另外,宣告另外一個物件為 lTest,它的型態為 x:String ,設定這個物件的值為 "我是 Xamarin.Forms"。
所以,只要在宣告 ResourceDictionary 節點之下的任何子節點,都可透過 StaticResource 這個延伸標記宣告方法,參考之前宣告的物件;例如,當要指定 Label 控制項的 FontSize 這個屬性值,就可以使用 {StaticResource lSize}這樣的用法,指定這個 Label 控制項的 FontSize 屬性值為 30。
<ContentPage.Resources>
    <ResourceDictionary>
      <x:Double x:Key="lSize">30</x:Double>
      <x:String x:Key="lText">我是 Xamarin.Forms</x:String>
    </ResourceDictionary>
  </ContentPage.Resources>
  <ContentPage.Content>
    <Grid>
      <Label Text="{StaticResource lText}"
             Grid.Row="0" Grid.Column="0"
             FontSize="{StaticResource lSize}"
             VerticalOptions="Center"
             HorizontalOptions="Center" />
    </Grid>
  </ContentPage.Content>

2017/01/16

Xamarin FAQ 1-015 : 究竟甚麼是 Prism

問題

在這份 Xamarin FAQ 問答集文件中,相關的解決方案,都會使用 Prism 框架下所提供的解決方法,不過,甚麼是 Prism呢?

解答

Prism 是個可以用於 Xamarin.Forms 的 MVVM 框架 (framework),這套框架當初是由微軟開發與維護的,不過,現在已經開放原始碼了。透過了 Prism 框架,已經協助您把許多 MVVM 設計模式 (Design Pattern)好用的機制製作出來了,只要您遵從 Prism 的規範,就可以很容易地開發出一個精簡、有效、方便管理的以 MVVM 為基礎的應用程式。另外,Prism 也把許多 Xamarin.Forms 本身的缺陷,進行改善了,您可以透過 Prism 所提供的 導航機制 / 對話窗 / 訊息聚合器等相關功能,大幅提升整體應用程式的開發效能與縮短開發時間。