XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

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 所提供的 導航機制 / 對話窗 / 訊息聚合器等相關功能,大幅提升整體應用程式的開發效能與縮短開發時間。

2017/01/15

《台北》Xamarin.Forms 跨平台行動應用程式開發實戰

全新第二代《台北》Xamarin.Forms 跨平台行動應用程式開發實戰昇級版教育訓練課程即將開課,這次課程將升級成為五天的課程內容,並將於 1/18 中午 12:00 開放報名。


有鑑於上次開課於半個小時之內就完售,對於想要使用 Xamarin.Forms 來進行開發跨平台行動裝置的人,千萬不要再次錯過這樣的機會。


《台北》Xamarin.Forms 跨平台行動應用程式開發實戰報名網址(2017 / 03 / 11 ~ 2017 / 03 / 25 ( 每周星期六、日 ))


課程主題

  • Xamarin.Forms 開發環境準備注意事項 ( 線上課程 )
    • 安裝與設定開發環境
      • Xamarin.Forms 開發環境示意圖
      • Mac 作業系統
      • Windows 作業系統
    • 需要準備的帳號與相關設定說明
    • 寫出並且確認可執行的 Hello World 的跨平台應用程式
    • 體驗跨平台應用程式
  • 第一天 (03/11) :Xamarin 開發工具集 探究與解密
    • Xamarin 開發平台介紹
    • Xamarin.Forms 適合您嗎?
    • 不同手機尺寸與解析度之視覺設計與套版方法
    • 共用程式碼與 UI 的方法選擇
    • 跨平台開發的問題與考量
    • Xamarin.Forms 開發環境準備與設定
    • Xamarin.Forms開發需求與學習指引
    • 不同專案類型、專案屬性、Android SDK介紹
    • 原生 Android / iOS 專案開發練習
  • 第二天 (03/12) :使用 Prism 與 MVVM 進行專案開發
    • Prism 開發框架說明:檢視模型定位器、導航服務、導航參數傳遞、深度連結、相依性注入、對話窗、事件聚合器
    • 何謂MVVM:沒有MVVM開發方法、自行建置MVVM開發環境、使用Prism的開發框架
    • 行動裝置應用程式開發上會遇到的各種不同情境與需求探討
    • Xamarin.Forms 開發技術要點
    • 頁面、版面配置、使用者介面控制項的使用和注意事項與練習
    • 導航頁面與導航抽屜頁面開發與設計上要注意的事項
    • 各種不同情境頁面應用開發設計練習
  • 第三天 (03/18) :何謂XAML與深入研究各種功能應用
    • 視覺宣告標記 XAML:何謂 XAML、文件結構與語法、XAML的限制、命名空間、項目、屬性、屬性項目、標記延伸功能、樣式與樣板
    • 資料繫結語法深入研究:綁定來源、綁定模式、綁定種類、BindingContext介紹、實際練習
    • 進階 XAML 技巧:XAML編譯、資源字典、靜態與動態資源、隱含與明確樣式、資源繼承、數值轉換器、字串格式化、平面轉換、可綁定屬性、附加屬性、附加行為、客製化控制項、使用者控制項、觸發、手勢操作、動畫
  • 第四天 (03/19) :Xamarin.Forms 核心服務與各種應用練習
    • Xamarin.Forms 核心服務與技術:如何從PCL專案執行原生專案的方法、如何從原生專案執行PCL專案功能、Device類別、客製專屬平台控制項
    • 常用套件與插件
    • 各種應用練習:檔案存取、SQLite資料庫、與裝置硬體互動、一維或二維條碼掃描與產生、OAuth2身分驗證、呼叫與存取Web服務、拍照與上傳到Web
  • 第五天 (03/25) :完整專案開發練習、測試、佈署
    • 企業差旅費用應用專案開發練習
    • 產生特定平台可發佈檔案與注意事項
    • Test Cloud 雲端視覺自動測試:UI測試REPL、針對企業差旅費用應用專案進行UI自動測試、使用 Xamarin Test Cloud在不同平台與裝置下進行 UI 自動測試
    • 測試、散佈工具 HocKeyApp:管理端與用戶端實際操作與介紹



Xamarin FAQ 1-14 : 如何從子頁面傳遞物件到父頁面

問題

當在一個子頁面是從父頁面導航過來的,不過,往往會有機會遇到這樣的情況,當從子頁面返回到父頁面的時候,需要把子頁面的一些狀態或者物件,傳回到父頁面中;所以,當回到父頁面的時候,就可以更新到最新的狀態。
+

解答

在使用 Prism 設計框架工具,我們可以使用事件聚合器 (Event Aggregator)來解決這樣的問題,在父頁面中,使用事件聚合器來訂閱這類事件,當在子頁面要回到父頁面的時候,可以透過事件聚合器發佈一個訊息,讓父頁面可以來處理。

2017/01/14

Xamarin FAQ 1-13 : 如何從父頁面傳遞物件到子頁面

問題

在進行導航頁面型態的應用程式開發的時候,經常會處理,當開啟一個新網頁的時候,需要傳遞一些物件到新頁面內,讓新頁面根據傳遞進來的物件,做出不同的處理動作。

解答

在導航物件的 NavigateAsync 方法內,可以接受 NavigationParameters 物件,這個物件的型別為 Dictionary<string, object>,因此,您可以透過 NavigationParameters 物件傳遞很多的物件到新(子)頁面內。
底下為 NavigateAsync 的方法簽章 Method Signature
        //
        // 摘要:
        //     Initiates navigation to the target specified by the name.
        //
        // 參數:
        //   name:
        //     The name of the target to navigate to.
        //
        //   parameters:
        //     The navigation parameters
        //
        //   useModalNavigation:
        //     If true uses PopModalAsync, if false uses PopAsync
        //
        //   animated:
        //     If true the transition is animated, if false there is no animation on transition.
        Task NavigateAsync(string name, NavigationParameters parameters = null, bool? useModalNavigation = default(bool?), bool animated = true);