XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2020/04/06

使用 Xamarin.Plugin.SharedTransitions 製作出具有跨頁面之共用項目動畫效果

使用 Xamarin.Plugin.SharedTransitions 製作出具有跨頁面之共用項目動畫效果

最近觀看完 .NET Conf: Focus on Xamarin 的 Building Beautiful Apps with Xamarin.Forms 影片,頓時間覺得 Xamarin.Forms 似乎又進化了許多,在這個影片中我看到許多驚豔內容,對於 Xamarin.Plugin.SharedTransitions 這個套件所產生出來的效果,更讓我想要能夠親自來嘗試看看,因此,我先從 Xamarin.Forms-Monkeys 這裡取得許多猴子介紹的紀錄內容,並且將這些內容包裝到練習使用的 NuGet 套件內,接著,實做出如下面影片中的動畫效果。
這個說明專案的原始碼為 xfSharedTransitions

範例專案說明

在這個測試範例專案中,將會使用 Prism Template Pack 建立一個 Xamarin.Forms 的專案,接著要安裝 Xamarin.FFImageLoading.Forms & Xamarin.Plugin.SharedTransitions 這兩個 NuGet 套件;這裡會用到 Xamarin.FFImageLoading.Forms 這個套件,這是因為一開始建立這個測試專案的時候,使用的是 Xamarin.Forms 內的 Image 元件,不過,由於要顯示的猴子圖片是來自於 Internet 上,因此,當要進行頁面切換的時候,對於共用圖片元件的動畫動作,變得不自然與動畫路徑怪怪的,可是,若使用 GiampaoloGabba / Xamarin.Plugin.SharedTransitions 內提供的範例專案,卻可以正常運作,經過了解,發現到該範例專案內使用的貓狗圖片,都是專案內的圖片檔案,不是透過 Internet 方式取得的,所以,就根據該專案的說明內容,嘗試使用 Xamarin.FFImageLoading.Forms 這個元件,讓圖片從 Internet 下載下來,使用本機上快取的圖片檔案,發現到就可以順利運作。
首先,在 [MainPage.xaml] 檔案中,建立底下的 XAML 宣告
在這裡因為會使用到 amarin.FFImageLoading.Forms & Xamarin.Plugin.SharedTransitions 功能,因此,加入了兩個命名空間 sharedTransitions & ffimageloading
而在 ContentPage 內,也使用到兩個附加屬性,用來宣告動畫需要多久的時間,這裡使用 sharedTransitions:SharedTransitionNavigationPage.TransitionDuration="500" 來宣告需要花費 500ms,並且使用 sharedTransitions:SharedTransitionNavigationPage.TransitionSelectedGroup="{Binding SelectedMonkeyId}" 用於宣告點選了哪個集合項目中的紀錄,若僅是做兩個頁面之間的切換,並沒有牽扯到集合項目,例如 ListView,這裡是可以不用使用這個附加屬性哦。
<?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="xfSharedTransitions.Views.MainPage"
             xmlns:behavior="http://prismlibrary.com"
             xmlns:sharedTransitions="clr-namespace:Plugin.SharedTransitions;assembly=Plugin.SharedTransitions"
             xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"
             sharedTransitions:SharedTransitionNavigationPage.TransitionDuration="500"
             sharedTransitions:SharedTransitionNavigationPage.TransitionSelectedGroup="{Binding SelectedMonkeyId}"
             Title="猴仔們">

    <Grid>
        <ListView
            HasUnevenRows="True"
            ItemsSource="{Binding AllMonkey}"
            SelectionMode="None"
            Footer="">
            <ListView.Behaviors>
                <behavior:EventToCommandBehavior
                    EventName="ItemTapped"
                    Command="{Binding MonkeyCommand}"
                    EventArgsParameterPath="Item"/>
            </ListView.Behaviors>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="50"/>
                                <RowDefinition Height="50"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="100"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Label
                                Grid.Row="0" Grid.Column="1"
                                HorizontalOptions="Start" VerticalOptions="End"
                                FontSize="24"
                                Text="{Binding Name}"/>

                            <Label
                                Grid.Row="1" Grid.Column="1"
                                HorizontalOptions="Start" VerticalOptions="Start"
                                FontSize="16"
                                Text="{Binding Location}"/>
                            <ffimageloading:CachedImage HeightRequest="80"
                                                        Grid.Row="0" Grid.RowSpan="2"
                                                        Aspect="AspectFit"
                                                        Source="{Binding ImageUrl}"
                                                        sharedTransitions:Transition.Name="MonkeyImage"
                                                        sharedTransitions:Transition.Group="{Binding Id}"/>
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>
    </Grid>
</ContentPage>
在這裡因為會使用到 amarin.FFImageLoading.Forms & Xamarin.Plugin.SharedTransitions 功能,因此,加入了兩個命名空間 sharedTransitions & ffimageloading
而在 ContentPage 內,也使用到兩個附加屬性,用來宣告動畫需要多久的時間,這裡使用 sharedTransitions:SharedTransitionNavigationPage.TransitionDuration="500" 來宣告需要花費 500ms,並且使用 sharedTransitions:SharedTransitionNavigationPage.TransitionSelectedGroup="{Binding SelectedMonkeyId}" 用於宣告點選了哪個集合項目中的紀錄,若僅是做兩個頁面之間的切換,並沒有牽扯到集合項目,例如 ListView,這裡是可以不用使用這個附加屬性哦。
在 ItemsTemplate 內,需要使用 sharedTransitions:Transition.Name="MonkeyImage" 這樣的附加屬性宣告,指定兩個頁面都有的共同視覺項目,宣告這裡需要進行動畫的變化動作,而 sharedTransitions:Transition.Group="{Binding Id}" 則是同樣用於集合檢視內才會用到的宣告,這裡將會指定這筆紀錄的 ID 到 Group 屬性內,而這個屬性可以是整數或者是字串,不過,必須具有唯一值特性。
對 MainPage 的 ViewModel,將會使用底下的 C# 程式碼來設計
public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
{
    public event PropertyChangedEventHandler PropertyChanged;

    private readonly INavigationService navigationService;
    public string Title { get; set; }
    public ObservableCollection<Monkey> AllMonkey { get; set; } = new ObservableCollection<Monkey>();
    public DelegateCommand<Monkey> MonkeyCommand { get; set; }
    public int SelectedMonkeyId { get; set; }
    public MainPageViewModel(INavigationService navigationService)
    {
        this.navigationService = navigationService;
        Title = MonkeyData.Monkeys.Count.ToString();
        MonkeyCommand = new DelegateCommand<Monkey>(async x =>
        {
            SelectedMonkeyId = x.Id;

            NavigationParameters para = new NavigationParameters();
            para.Add(nameof(Monkey), x);
            await Task.Delay(100);
            await navigationService.NavigateAsync(nameof(DetailPage), para);
        });
    }

    public void OnNavigatedFrom(INavigationParameters parameters)
    {
    }

    public void OnNavigatedTo(INavigationParameters parameters)
    {
        int idx = 1;
        foreach (var item in MonkeyData.Monkeys)
        {
            AllMonkey.Add(item);
            idx++;
        }
    }

    public void OnNavigatingTo(INavigationParameters parameters)
    {
    }

}
對於點選 ListView 的某個紀錄,將會觸發 MonkeyCommand 這個命令,從這個命令參數中,可以取得使用者所點選的物件值,在這裡,將會把所點選的紀錄物件值,透過導航參數的鍵值 Monkey 傳送到下個頁面去
對於要切換過去的頁面,這裡新增一個 DetailPage.xaml 頁面與 DetailPageViewModel.cs 這兩個檔案,其中,對於頁面部分,將會設計底下的 XAML 宣告內容
從這裡可以很清楚的看到,僅有在圖片檢視的地方,使用到 sharedTransitions:Transition.Name="MonkeyImage" 宣告,這是用來串接兩個頁面共用檢視的宣告方式。
<?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:prism="http://prismlibrary.com"
             prism:ViewModelLocator.AutowireViewModel="True"
             xmlns:ffimageloading="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"
             xmlns:sharedTransitions="clr-namespace:Plugin.SharedTransitions;assembly=Plugin.SharedTransitions"
             x:Class="xfSharedTransitions.Views.DetailPage"
             Title="{Binding Monkey.Name, StringFormat='猴子:{0}'}"
             >

    <Grid>
        <ScrollView>
            <StackLayout Orientation="Vertical">
                <ffimageloading:CachedImage HeightRequest="300" WidthRequest="300"
                                                        Aspect="AspectFit"
                                                        Source="{Binding Monkey.ImageUrl}"
                                                        sharedTransitions:Transition.Name="MonkeyImage"
                                                        />
                <Label
                    HorizontalOptions="Center" VerticalOptions="End"
                    FontSize="24"
                    Text="{Binding Monkey.Name}"/>

                <Label
                    HorizontalOptions="Center" VerticalOptions="Start"
                    FontSize="16"
                    Text="{Binding Monkey.Location}"/>
                <Label
                    HorizontalOptions="Start" VerticalOptions="Start"
                    FontSize="14"
                    Text="{Binding Monkey.Details}"/>
            </StackLayout>
        </ScrollView>
    </Grid>
</ContentPage>




2020/04/05

在開發 Xamarin.Forms 專案的時候,可以讓 Android Emulator 模擬器存取本機 localhost ASP.NET Core Web API 服務的做法

在開發 Xamarin.Forms 專案的時候,可以讓 Android Emulator 模擬器存取本機 localhost ASP.NET Core Web API 服務的做法

當在進行 Xamarin.Forms 專案開發設計的時候,由於後端系統尚在開發過程中,因此,將會需要在本機來啟動這個開發中的 Web API 服務。
例如,當使用 ASP.NET Core 來開發出一個 Web API 專案,此時,若要存取這個專案所提供的 Web API 服務,就需要使用類似這樣的 URI https://localhost:5001/weatherforecast ,不過,從這個 URL 將會發現到,這個主機使用了 localhost ,使用 Xamarin.Forms 所開發出來的 Android 專案,將會在 Android Emulator 模擬器下來運行,此時,在 Android 模擬器下,對於這個 localhost 主機,將只會存取到本身模擬器內的 5001 埠,可是,這台 Android 模擬器內的 5001 埠內,並沒有任何 Web API 服務,該服務存在取當時開發主機的作業環境下。
在這篇文章中,將會嘗試提出一個解法 (當然,對於這樣的問題,是有其他不同的解決方法,大家可以想看看還有哪些方法呢?)
在此,請先建立一個 ASP.NET Core 的 Web API 專案
請打開 Startup.cs 檔案,為了將整個展示過程予以簡化,因此,將不會強制使用 HTTPS 這樣的協定,所以,找到 app.UseHttpsRedirection(); 敘述,將其註解起來。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    //app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
接著,在命令提示字元視窗內,輸入 ipconfig 命令,將會出現如下內容,這在這裡可以找到當前這台電腦中所使用 ip address,這裡將會看到 ip = 192.168.31.153
.
.
.
無線區域網路介面卡 Wi-Fi:

   連線特定 DNS 尾碼 . . . . . . . . :
   連結-本機 IPv6 位址 . . . . . . . : fe80::b975:1a80:f870:eb77%16
   IPv4 位址 . . . . . . . . . . . . : 192.168.31.153
   子網路遮罩 . . . . . . . . . . . .: 255.255.255.0
   預設閘道 . . . . . . . . . . . . .: 192.168.31.1
.
.
.
在這個 ASP.NET Core Web API 專案內,展開 Properties 節點,將會看到 launchSettings.json 這個檔案,請打開這個檔案。
找到 CoreLocalAPI 這個屬性,從該屬性內找到 applicationUrl 這個節點,將該節點值修正為 https://localhost:5001;http://localhost:5000;https://192.168.31.153:5001;http://192.168.31.153:5000
{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:63459",
      "sslPort": 44333
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "CoreLocalAPI": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "applicationUrl": "https://localhost:5001;http://localhost:5000;https://192.168.31.153:5001;http://192.168.31.153:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
現在,可以使用命令提示字元視窗,切換到這個 API 專案所在的目錄下,並且輸入 dotnet run
如此,這個 Web API 專案便會在本機上開始執行了,從底下的啟動文字內容中,可以看到除了原先可以使用的 http://localhost:5000 URL 之外,還可以透過 http://192.168.31.153:5000 這個 URL 來連線到這 Web API 服務上。
Microsoft Windows [版本 10.0.18363.693]
(c) 2019 Microsoft Corporation. 著作權所有,並保留一切權利。

D:\Vulcan\Projects\CallLocakAPI\CoreLocalAPI>dotnet run
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://192.168.31.153:5001
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://192.168.31.153:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: D:\Vulcan\Projects\CallLocakAPI\CoreLocalAPI
因此,當在瀏覽器中輸入了 http://192.168.31.153:5000 URL 之後,將會看到底下的輸出內容
[{"date":"2020-03-10T12:21:44.4886014+08:00","temperatureC":-7,"temperatureF":20,"summary":"Mild"},{"date":"2020-03-11T12:21:44.4889745+08:00","temperatureC":44,"temperatureF":111,"summary":"Mild"},{"date":"2020-03-12T12:21:44.4889768+08:00","temperatureC":-19,"temperatureF":-2,"summary":"Hot"},{"date":"2020-03-13T12:21:44.488977+08:00","temperatureC":23,"temperatureF":73,"summary":"Scorching"},{"date":"2020-03-14T12:21:44.4889772+08:00","temperatureC":52,"temperatureF":125,"summary":"Balmy"}]
當確認 Web API 可以透過本機電腦的 WIFI IP 連線之後(不再僅需要透過 localhost 才能夠連線),現在可以來建立一個 Xamarin.Forms 的專案。
其中 View 的內容如下
<?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="CallLocakAPI.Views.MainPage"
             Title="{Binding Title}">

    <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
        <Label Text="Welcome to Xamarin Forms and Prism!" />
        <Label Text="{Binding IP}" FontSize="16" TextColor="Blue"/>
        <Label Text="{Binding APIResult}" FontSize="14" TextColor="Red"/>
    </StackLayout>

</ContentPage>
而 ViewModel 的程式碼如下
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CallLocakAPI.ViewModels
{
    using System.ComponentModel;
    using System.Net.Http;
    using Localhost;
    using Prism.Events;
    using Prism.Navigation;
    using Prism.Services;
    using Xamarin.Essentials;

    public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private readonly INavigationService navigationService;
        public string IP { get; set; }
        public string APIResult { get; set; }
        public MainPageViewModel(INavigationService navigationService)
        {
            this.navigationService = navigationService;

        }

        public void OnNavigatedFrom(INavigationParameters parameters)
        {
        }

        public async void OnNavigatedTo(INavigationParameters parameters)
        {
            IP = CrossLocalhost.Current.Ip;

            HttpClient client = new HttpClient();
            string result;
            try
            {
                APIResult = await client.GetStringAsync("http://192.168.31.153:5000/weatherforecast");

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }

        public void OnNavigatingTo(INavigationParameters parameters)
        {
        }

    }
}
這個測試結果將會如下圖,從底下截圖的執行結果中可以看到這個 Android 模擬器當時使用 IP Address 為 10.0.2.2,而可以實際連線到本機電腦上跑的 Web API,並且得到執行結果。



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 操作示意圖