XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2016/09/09

Xamarin.Forms 多奇數位創意之標籤式 頁面

多奇數位創意之標籤式 頁面

目的

當在進行 Xamarin.Forms 專案開發的時候,應用程式的首頁設計,有許多種方式,其中一種就是設計成為具有多標籤頁次的效果,為了方便展示,每個標籤頁面將會使用 WebView 包裝某網頁內容。
底下動畫圖片,說明了多標籤頁次的使用方式。
多奇創意之標籤式操作

學習重點

在這個練習專案中,將會讓您學會底下技能與方法的使用:
  • 將企業內部網站建置到行動應用程式的作法
  • WebView 控制項的使用方式與效果
  • NavigationService.NavigateAsync 的絕對與相對位置的導航使用方式
  • 在 Xaml 檔案中,加入其他 Xaml 項目命名空間做法
  • 使用 TabbedPage.BarBackgroundColor & TabbedPage.BarTextColor 屬性,客製化標籤式頁面的配色效果
  • 使用 NavigationPage.BarBackgroundColor & NavigationPage.BarTextColor 屬性,客製化導航頁面的配色效果
  • 多頁次頁面的 TabbedPage 使用方式與宣告方法
  • 硬體回上一頁按鈕的控制方法
  • 導航頁面的工作列項目的使用方式
  • IConfirmNavigationAsync 介面的實作應用,用於控制當要來開這個頁面前,需要經過檢查與運作,才能夠會執行
  • 在標籤式頁面中,設定每個頁面的代表圖示
  • 在 UI 執行緒的使用方式 Device.BeginInvokeOnMainThread
  • 在 Code-behind 程式碼中,取得該網頁所綁定的檢視模型

專案原始碼

專案使用到的圖片

實作方法

建立專案

  1. 在 Visual Studio 2015,點選功能表 檔案 > 新增 > 專案
  2. 在 新增專案 對話窗內,點選 範本 > Visual C# > Prism > Prism Unity App (Forms)
  3. 在底下名稱欄位中,輸入 HomeTabbed 最後,點選 確定 按鈕。
  4. 當出現 Prism for Xamarin.Forms - Project Wizard 對話窗,請勾選 AndroidiOSUWP 這三個選項,表示您想要產生使用 Prism 框架的這三種原生 Xamarin.Forms 專案,最後點選 Create 按鈕。
當專案建立到一半,若您的開發環境還沒有建置與設定完成 Mac 電腦與 Xamarin Studio for Mac 系統,此時會看到 Xamarin Mac Agent Instructions 對話窗出現,這個對話窗是要提醒您進行與 Mac 電腦連線設定,這是因為,您無法在 Windows 作業系統進行 iOS 相關應用程式的建立與設計工作,而是需要透過 Mac 電腦安裝的 XCode 來協助您完成這些 iOS 應用程式的建立工作。不過,這不影響您繼續開發 Xamarin.Forms 的應用程式,只不過此時,您無法編譯與執行 iOS 的應用程式。
  1. 接著會看到 新的通用Windows專案 對話視窗,此時,您只需要按下 確定 按鈕即可,此時,專案精靈會繼續完成相關平台的專案建立工作。
  2. 最後,整個新的 Xamarin.Forms 專案就建立完成了。
若您無法看到 Prism 項目,用來建立 Prism 類型專案,那可能是您的 Visual Studio 2015 內沒有安裝Prism Template Pack 擴充功能,請參考 附件 : 使用 Visual Studio 2015 增加 Prism 專案樣版
  1. 滑鼠右擊 HomeTabbed.Droid,選擇 設定為起始專案
  2. 展開 HomeTabbed.Droid > Properties,滑鼠雙擊 Properties 這個節點
  3. 在標籤頁次 Application,選擇項目 Minimum Android to target的下拉選單,選擇值為 Android 4.4 (API Level 19 - Kit Kat) 這個選項,接著按下 Ctrl + S 組合案件,儲存此次修改設定。
  4. 滑鼠右擊 HomeTabbed.Droid,選擇 建置 進行專案編譯

開發前準備工作

建立資料夾

複製專案使用的圖片檔案

  1. 請從底下網址取得所要用到的圖片檔案到電腦的硬碟某個目錄下
  2. 使用檔案總管選擇剛剛下載完成的圖檔
  3. 利用檔案總管,拖拉這些圖檔到 Android 專案內的 Resources/drawable 資料夾內
  4. 利用檔案總管,拖拉這些圖檔到 iOS 專案內的 Resources 資料夾內
  5. 利用檔案總管,拖拉這些圖檔到 UWP 專案內的 Assets 資料夾內

專案開發

建立 HomePage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 HomePage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

HomePage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
            prism:ViewModelLocator.AutowireViewModel="True"
            xmlns:local="clr-namespace:HomeTabbed.Views"
            TabbedPage.BarBackgroundColor="#00b300"
            TabbedPage.BarTextColor="#e6ffe6"  
            NavigationPage.HasNavigationBar="false"
            Title="多奇創意"
            x:Class="HomeTabbed.Views.HomePage">

  <local:MainPage  />
  <local:NewsPage />
  <local:OurProductPage />
  <local:JoinUsPage />

</TabbedPage>

建立 JoinUsPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 JoinUsPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

JoinUsPage.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"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             Title="加入我們"
             BackgroundColor="#ccffe6"
             Icon="join.png"
             x:Class="HomeTabbed.Views.JoinUsPage">
  <StackLayout
    Orientation="Vertical"
    HorizontalOptions="Center" VerticalOptions="Center"
    >
    <Button Text="了解更多" Command="{Binding 了解更多Command}"
            TextColor="#000000"
            HorizontalOptions="Center"
            />
  </StackLayout>

</ContentPage>

建立 NaviPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 NaviPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內
<?xml version="1.0" encoding="utf-8" ?>
<NavigationPage xmlns="http://xamarin.com/schemas/2014/forms"
                xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
                prism:ViewModelLocator.AutowireViewModel="True"
                NavigationPage.BarBackgroundColor="#00b300"
                NavigationPage.BarTextColor="#FFFFFF"
                Title="多奇創意"
                x:Class="HomeTabbed.Views.NaviPage">

</NavigationPage>

建立 NewsPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 NewsPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

NewsPage.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"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             Title="最新消息"
             Icon="news.png"
             x:Class="HomeTabbed.Views.NewsPage">

  <WebView
    Source="https://www.facebook.com/will.fans/posts/911508538878291"
    />

</ContentPage>

建立 Other1ContentPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 Other1ContentPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

Other1ContentPage.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"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             Title="歡迎加入我們"
             BackgroundColor="#ccffe6"
             x:Class="HomeTabbed.Views.Other1ContentPage">
  <ContentPage.ToolbarItems>
    <ToolbarItem
      Command="{Binding 首頁Command}"
      AutomationId="searchCommand"
      Text="首頁"
      Order="Primary"
      Priority="0">
      <ToolbarItem.Icon AutomationId="searchIcon">
        <OnPlatform x:TypeArguments="FileImageSource"
          iOS="home.png"
          Android="home.png"
          WinPhone="Assets/home.png" />
      </ToolbarItem.Icon>
    </ToolbarItem>
  </ContentPage.ToolbarItems>

  <StackLayout
    Orientation="Vertical"
    HorizontalOptions="Center" VerticalOptions="Center"
    >
    <Button Text="立即加入" Command="{Binding 立即加入Command}"
            TextColor="#000000"
            HorizontalOptions="Center"
            />
  </StackLayout>
</ContentPage>

建立 Other2ContentPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 Other2ContentPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

Other2ContentPage.xaml



建立 AboutPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 AboutPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

AboutPage.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"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             Title="保哥部落格"
             x:Class="HomeTabbed.Views.Other2ContentPage">

  <WebView
    Source="http://blog.miniasp.com/"
    />
</ContentPage>

建立 OurProductPage 檢視 (View)

  1. 滑鼠右擊核心PCL專案的 Views 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ContentPage (Forms)
  3. 在名稱欄位輸入 OurProductPage,接著點選 新增 按鈕
  4. 將底下 XAML 標記宣告複製到剛剛建立的檔案內

OurProductPage.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"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             Title="酷奇資訊"
             Icon="school.png"
             x:Class="HomeTabbed.Views.OurProductPage">

  <WebView
    Source="https://www.accupass.com/org/detail/r/1507090942441281249650/1/0"
    />
</ContentPage>

修改 MainPage 檢視 (View)

  1. 在核心PCL專案的 Views 資料夾,滑鼠雙擊 MainPage.xaml
  2. 將底下 XAML 標記宣告複製到剛剛開啟的檔案內

MainPage.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"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="HomeTabbed.Views.MainPage"
             Title="多奇創意"
             Icon="doggy.png"
             >
  <WebView
    Source="http://www.miniasp.com/"
    />
</ContentPage>

建立 HomePageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 HomePageViewModel,接著點選 新增 按鈕
  4. 將底下 C# 程式碼複製到剛剛建立的檔案內

HomePageViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;

namespace HomeTabbed.ViewModels
{
    public class HomePageViewModel : BindableBase
    {
        public HomePageViewModel()
        {

        }
    }
}

建立 JoinUsPageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 JoinUsPageViewModel,接著點選 新增 按鈕
  4. 將底下 C# 程式碼複製到剛剛建立的檔案內

JoinUsPageViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;

namespace HomeTabbed.ViewModels
{
    public class JoinUsPageViewModel : BindableBase
    {
        #region DI
        INavigationService _navigationService;
        #endregion

        #region ICommand
        public DelegateCommand 了解更多Command { get; set; }
        #endregion

        public JoinUsPageViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;

            了解更多Command = new DelegateCommand(了解更多);
        }

        private async void 了解更多()
        {
            await _navigationService.NavigateAsync(new Uri("NaviPage/Other1ContentPage", UriKind.Relative));
        }
    }
}

建立 NaviPageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 NaviPageViewModel,接著點選 新增 按鈕
  4. 將底下 C# 程式碼複製到剛剛建立的檔案內
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;

namespace HomeTabbed.ViewModels
{
    public class NaviPageViewModel : BindableBase
    {
        public NaviPageViewModel()
        {

        }
    }
}

建立 NewsPageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 NewsPageViewModel,接著點選 新增 按鈕

建立 Other1ContentPageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 Other1ContentPageViewModel,接著點選 新增 按鈕
  4. 將底下 C# 程式碼複製到剛剛建立的檔案內

Other1ContentPageViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using Prism.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace HomeTabbed.ViewModels
{
    public class Other1ContentPageViewModel : BindableBase, IConfirmNavigationAsync
    {
        #region DI
        INavigationService _navigationService;
        IPageDialogService _dialogService;
        #endregion

        #region ICommand
        public DelegateCommand 立即加入Command { get; set; }
        public DelegateCommand 首頁Command { get; set; }
        #endregion

        #region property
        public bool 需要檢查是否可以離開頁面 { get; set; } = true;
        #endregion

        public Other1ContentPageViewModel(INavigationService navigationService, IPageDialogService dialogService)
        {
            _navigationService = navigationService;
            _dialogService = dialogService;

            立即加入Command = new DelegateCommand(立即加入);
            首頁Command = new DelegateCommand(首頁);
        }

        public async void 首頁()
        {
            await _navigationService.NavigateAsync(new Uri("http://vulcan.net/HomePage/JoinUsPage", UriKind.Absolute));
        }

        private async void 立即加入()
        {
            需要檢查是否可以離開頁面 = false;
            await _navigationService.NavigateAsync(new Uri("Other2ContentPage", UriKind.Relative));
        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {
        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {
        }

        public async Task<bool> CanNavigateAsync(NavigationParameters parameters)
        {
            if (需要檢查是否可以離開頁面 == true)
            {
                var fooReslut = await _dialogService.DisplayAlertAsync("警告", "您確定要回到首頁嗎?", "是", "否");
                if (fooReslut == true)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                需要檢查是否可以離開頁面 = true;
                return true;
            }
        }
    }
}

建立 Other2ContentPageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 Other2ContentPageViewModel,接著點選 新增 按鈕

建立 OurProductPageViewModel 檢視模型 (ViewModel)

  1. 滑鼠右擊核心PCL專案的 ViewModels 資料夾,選擇 加入 > 新增項目
  2. 在對話窗點選 Visual C# > Prism > Prism ViewModel
  3. 在名稱欄位輸入 OurProductPageViewModel,接著點選 新增 按鈕

修改 MainPageViewModel 檢視模型 (ViewModel)

  1. 在核心PCL專案的 ViewModels 資料夾,滑鼠雙擊 MainPageViewModel
  2. 將底下 C# 程式碼複製到剛剛開啟的檔案內

MainPageViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;

namespace HomeTabbed.ViewModels
{
    public class MainPageViewModel : BindableBase, INavigationAware
    {
        private string _title;
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        public MainPageViewModel()
        {

        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {

        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {
            if (parameters.ContainsKey("title"))
                Title = (string)parameters["title"] + " and Prism";
        }
    }
}

修改 Xamarin.Forms 進入點 App.xaml.cs

App.xaml.cs

  1. 在核心PCL專案找到 App.xaml.cs 檔案,滑鼠雙擊以開啟這個檔案
  2. 將底下 C# 複製到剛剛開啟的檔案內
using Prism.Unity;
using HomeTabbed.Views;

namespace HomeTabbed
{
    public partial class App : PrismApplication
    {
        public App(IPlatformInitializer initializer = null) : base(initializer) { }

        protected override void OnInitialized()
        {
            InitializeComponent();

            NavigationService.NavigateAsync(new System.Uri("http://vulcan.net/HomePage", System.UriKind.Absolute));
        }

        protected override void RegisterTypes()
        {
            Container.RegisterTypeForNavigation<MainPage>();
            Container.RegisterTypeForNavigation<HomePage>();
            Container.RegisterTypeForNavigation<JoinUsPage>();
            Container.RegisterTypeForNavigation<NewsPage>();
            Container.RegisterTypeForNavigation<OurProductPage>();
            Container.RegisterTypeForNavigation<NaviPage>();
            Container.RegisterTypeForNavigation<Other1ContentPage>();
            Container.RegisterTypeForNavigation<Other2ContentPage>();
        }
    }
}

2016/09/08

Xamarin.iOS 使用遠端 MacInCloud 服務,進行 iOS 應用程式除錯

MacinCloud 線上服務,提供了遠端 Mac 電腦(上面已經安裝好 Xcode & Xamarin Studio開發工具),讓您可以使用本地端的 Visual Studio 2015,透過網路連線到遠端 Mac 電腦上的 Xamarin Mac Agent 服務。

申請 MacInCloud

  1. 使用這個 連結 進行註冊與登入到 MacInCloud 系統
  2. 選擇 Pay-As-You-Go 產品,每小時使用費用為 $1 美元,一次要能購買 30 個小時
    MacinCloud
  3. 接著選取這台機器的所在位置(可以選擇北美地區, 因為台灣到美國的頻寬比較順暢)
    另外,在作業系統版本方面,請選取 OS X EI Capitan 10.11.6 (Support Xcode 7.3.1)
    MacinCloud
  4. 接著,請注意,一定要加購 Open Remote Build Port 這項服務,接著,填寫付款資訊,您可以使用信用卡或者 PayPal 來付款
    MacinCloud
  5. 付款交易完成之後,會看到如下畫面,此時,請檢查您的信箱
    MacinCloud

開始遠端連線到 MacInCloud

  1. 在您收到的郵件中,您會看到要連線到這台 Mac 電腦的 IP、帳號與密碼
    MacinCloud
  2. 在同樣郵件的下方有這段文字 Download your MacinCloud connection files from the following link: http://www.macincloud.com/images/MacinCloud_AS119.zip
    請下載上面文字中連結的壓縮檔案,並且使用解壓縮檔案加開該壓縮檔案。選擇您要開啟的遠端桌面連線設定檔案。
    MacinCloud
  3. 這個時候,遠端桌面開啟了,請使用剛剛郵件中提供的帳號與密碼,進行登入到遠端 Mac 電腦上
    MacinCloud
    MacinCloud

使用 Visual Studio 2015 開始進行 iOS 程式除錯

  1. 回到 Visal Studio 2015 上,點選功能表 工具 > iOS > Xamarin Mac Agent 選項,並且建立一個與遠端 Mac 連線的資訊,當帳號與密碼正確輸入之後,會看到如下畫面
    MacinCloud
    一旦 Visual Studio 2015 成功與遠端 Mac 電腦連線上,會出現底下畫面
    MacinCloud
  2. 開啟一個舊的 Xamarin.Forms 專案或者新建立一個 Xamarin.Forms 專案,將 iOS 原生專案設為預設專案,此時,會在工具列上看到 iOS 的執行環境,請設定 方案平台 為 iPhoneSimulator,並且選擇要執行的模擬器版本
    MacinCloud
  3. 若您原來 Visual Studio 2015 有使用 iOS Simulator for Windows 請參考下圖,將其關閉 (可以從功能表 工具 > 選項 開啟此對話窗)
    MacinCloud11
  4. 此時,您可以透過 Visual Studio 2015 開始執行這個 iOS 專案,這個時候您會在連線到 Mac 的遠端桌面程式,看到 iOS 模擬器已經啟動了,必且您的專案程式也正在執行中。
    MacinCloud11

特別注意事項

若您不再需要進行遠端 Mac 的連線,請記得要在遠端桌面的Mac電腦環境,登出您的帳號。
MacinCloud

Xamarin 如何得知不同 PCL 版本支援那些功能

請查看這個網址

2016/09/07

Xamarin 開啟一個Xamarin.Forms專案,卻無法執行 UWP 除錯

開啟一個Xamarin.Forms專案,卻無法執行 UWP 除錯

當您開啟一個 Xamarin.Forms 專案,並且設定 UWP 專案為預設執行專案,當想要開始進行 UWP 應用程式的 Windows 10 Mobile 除錯的時候,出現了底下錯誤訊息:
必須先佈署專案 "xxx.UWP" 後才能加以啟動。
必須先部屬專案
此時,請點選 Visual Studio 功能表的 建置 > 組態管理員 選項
組態管理員1
在組態管理員對話窗內,勾選 xxx.UWP 專案的 建置 / 佈署 檢查盒

Xamarin Windows 10 Mobile 手機需要解鎖、註冊

Windows 10 Mobile 手機需要解鎖、註冊

當要針對實體的 Windows 10 Mobile 手機進行除錯時候,首先,您需要將該實體手機透過 USB 接到電腦上,並且使用 Visual Studio 2015 開始進行除錯;不過,此時,您可能會看到類似底下的錯誤訊息:
錯誤 DEP0200 : 確認開發人員已將裝置解除鎖定。如需開發人員解除鎖定的詳細資訊,請造訪http://go.microsoft.com/fwlink/?LinkId=317976. 0x-2147009281: To install this application you need either a Windows developer license or a sideloading-enabled system. (Exception from HRESULT: 0x80073CFF) CameraManualControls
會發生這樣的原因,那是因為這支手機尚未經過註冊程序,需要進行開發人員解除鎖定成,才能夠進行除錯,請透過底下步驟來進行開發人員解除鎖定:
  1. 在左下角點選 搜尋 Windows 按鈕,輸入 Phone 關鍵字,並且點選如下圖的 Windows Phone Developer Registration 程式。
    Win10Mobile註冊
  2. 當出現 Windows Phone 開發人員註冊 對話窗,並且內容如下,那麼您可能手機進入休眠狀態、或者手機沒有接到電腦上,在此,請保持手機要再開機狀態,並且接到電腦上,之後,按下 重試 按鈕。
    Win10Mobile註冊
  3. 當按鈕變成 註冊 那就表示您的手機準備要進行開發人員電話註冊程序,請點選 註冊 按鈕
    Win10Mobile註冊
    Win10Mobile註冊

2016/09/06

Xamarin 如何測載打包後的 Windows Mobile 10 檔案到手機上

當您建立了應用程式套件,將會發現有這樣 .appxbundle 檔案產生,此時,要如何將這個應用程式套件安裝到 Windows 10 Mobile 的手機上呢?
  1. 打開手機,進入到所有 設定頁面 > 更新與安全性 > 開發人員專用 > 開發人員模式
  2. 回到電腦上,請建立該專案的 Windows 10 Mobile 應用程式套件
  3. 請在手機上使用檔案總管程式,在手機上建立一個 Apps 的資料夾
  4. 在電腦上,請將產生好的安裝套件(會在 AppPackages目錄下)的整個目錄(目錄裡面會有包含 .appxbundle 檔案)複製到手機內(Apps目錄下)
  5. 回到手機,使用檔案總管,點選剛剛複製的目錄下,找到產生的 .cer 檔案,點選他,進行憑證
  6. 在手機上,使用檔案總管,切換到 Dependencies > ARM 目錄下,點選Microsoft.NET.CoreRuntime.1.0.appx & Microsoft.VCLibs.ARM.Debug.14.00.appx 這兩個檔案,進行安裝。
    +
  7. 回到手機,使用檔案總管,點選剛剛複製的目錄下,找到產生的 .appxbundle 檔案,進行安裝該App

2016/09/05

開發 Xamarin.Forms 建議的開發配備

開發跨平台的原生應用程式 (Native App),勢必要考慮到各種行動裝置的開發與測試情境,採用模擬器來測試原生應用程式是最常見的作法。當您選擇 Xamarin.Forms 來建置 App 時,最讓人頭疼的就是架設好完整的開發環境,然而跨平台的 App 會牽涉到許多平台上的限制,對於軟硬體配備的選擇就是一門大學問,本篇文章將說明在不同需求下需要考量的軟硬體配置。

電腦與作業系統需求

Mac OS X

  • 作業系統需求:Mac OS X Yosemite(10.10) 或者以上版本
  • 需要安裝最新版本的 Xcode 與 iOS SDK ( 可以從 iOS Developer Center 來下載 )
  • 安裝最新版本的 Xamarin Studio ( 可以從 這裡 來下載 )

Windows

  • 作業系統需求:Windows 10 Professional
  • 需要安裝 Hyper-V 服務
  • 安裝 Visual Studio 2015 ( 可以從 這裡 來下載 )

開發工具需求

透過 Xamarin.Forms 來開發跨平台的原生應用程式 (Native App),在不同的作業系統與整合開發環境 IDE 工具能夠產生出不同類型的原生應用程式,目前有以下兩個 IDE 工具可選:

Visual Studio 2015 (只能執行在 Windows 上面)

  • 可以開發、建置原生 Android / UWP 應用程式。
  • 安裝時,請記得要勾選 Android 原生開發套件(SDK) 與 通用應用程式開發工具 (UWP SDK) 安裝到您的電腦下。

Xamarin Studio (只能執行在 Mac 電腦上)

  • 可以開發、建置原生 Android / iOS 應用程式。
  • 您必須額外安裝 iOS SDK & Xcode 等工具程式。
簡單來說,你沒辦法透過 Mac 電腦產生出 UWP 應用程式,也沒辦法單純只用 Windows 電腦產生出 iOS 應用程式。
若您想同時開發出 iOS / Android / UWP 等跨平台應用程式,你必須至少準備兩台電腦才有辦法建置出完整的跨平台應用程式。

常見問題解答

  1. 我可否在 Mac OS X 上面安裝虛擬機器,並且在 VM 中跑 Windows 作業系統,這樣我可以用一台 Mac 電腦進行跨平台應用程式開發嗎?
    Windows 10 Mobile 模擬器需要 Hyper-V 服務才能夠運行,因此,若在 Mac OS X 上安裝虛擬機器,並且在 VM 中跑 Windows 作業系統,可能無法在 Windows 作業系統上,再度啟動 Windows 10 Mobile 模擬器。
  2. 當 Android & iOS 有最新的SDK推出,Xamarin 何時可以支援這些最新的 SDK?
    對於有新版本的 Android & iOS 推出後,根據以往經驗,最多 2~7天,Xamarin 就會推出相對應的更新,讓您可以使用這些最新的 SDK 來開發這些應用程式。
  3. 當我選擇使用 Xamarin,我的應用程式有多少比例使用 C# 撰寫出來?
    您的應用程式將會 100% 都使用 C# 來撰寫並開發出來,這包含了 UI、商業邏輯。
  4. 在進行 Xamarin.Forms 應用程式開發時候,我可以使用第三方的 .NET 程式庫嗎?
    是的,例如,您可以使用 Json.NET NuGet 套件在 PCL 專案上或者使用在各個原生專案上。
  5. 當我在 Windows 作業系統的 Visual Studio 2015 開發 Xamarin.Forms 應用程式,卻無法透過 Xamarin Mac Agent 與遠端 Mac電腦連線?
    您需要在 Mac 電腦上啟用 遠端登入 功能,並且設定相關帳號可以使用遠端登入功能;若還是不行,請確認 Mac 電腦上沒有做 SSH ( 22 Port)的阻擋。您可以在 Windows 作業系統上,使用類似 Putty 這裡終端機連線工具,設定使用 SSH 方式連線到 Mac 電腦來進行測試。
  6. 我使用 Xamarin.Forms 進行開發跨平台應用程式,我還需要學習個平台的 UI 定義與設計方法嗎?
    若您採用 Xamarin.Forms 進行開發跨平台應用程式,所有的頁面 UI 都會透過 XAML 標記宣告語言來定義;因此,您不再需要學習 Android 的 XML UI定義與 iOS 的 Storyboard。
  7. 當我使用 Visual Studio 開發 Xamarin.Froms 應用程式,我可以在 Windows 系統上看到 iOS 模擬器嗎?
    當然可以,若您使用 Visual Studio 開發 Xamarin.Forms應用程式,可以同時看到與操作 Android, iOS, Windows 10 Mobile 的模擬器;若您想要在 Windows 作業系統上使用 iOS 模擬器,請安裝 iOS Simulator (for Windows)
  8. 哪個 Visual Studio 2015 版本支援 Xamarin.Forms 的應用程式開發
    全系列的 Visual Studio 2015 都可以開發 Xamarin.Forms 的應用程式,包含 Visual Studio 2015 社群版本。
  9. 由於 Xamarin.Forms 程式會在 PCL 專案內開發,我可以在 PCL 專案內呼叫原生(Android/iOS/UWP)專案內的各項功能嗎?(例如:拍照、GPS定位等等)
    這絕對是沒有問題,您可以透過插件 (Plug-ins)或者 Xamarin.Forms 內建的相依性服務功能,來做到這些需求。
  10. 想要使用 Xamarin.Forms 開發應用程式,有哪些技術項目是要學的?
    只要您精通 C# / XAML / MVVM 這些觀念與技巧,就可以快速開發出容易維護與高效能的原生應用程式。
  11. 我可以針對特定平台的 UI 進行客製化設計,例如:在 Android 平台中的文字輸入盒,可以有四週框線?
    完全沒有問題,您可以透過 UI Renderer 技術,針對不同平台來客製化 UI 要顯示成為甚麼樣貌。
  12. Xamarin.Forms 有支援 UI 自動測試功能嗎?
    您可以使用 Xamarin.UITest 來撰寫 UI 自動測試的程序,並且透過 Xamarin 提供的 Test Cloue,將您的應用程式一次佈署不同的實體使用上,得到在不同手機上的測試結果與當時的螢幕截圖。注意,這項服務需要另外付費
  13. 哪些種類的應用程式,不適合使用 Xamarin.Forms 方式來進行開發。
    具有豐富變化的UI設計(例如 Game)、需要使用大量原生平台專屬 API (大量地圖方面的應用)、多媒體應用程式(AR / VR)、客製UI比起共用程式碼來的重要的應用程式(每個平台,需要大量客製化不同樣貌的UI)、

Xamarin.Forms Windows UWP 客製化狀態列

Windows UWP 客製化狀態列

首先,需要將 Windows Mobile Extension for the UWP 擴充功能加入到專案內。
UWP專案 > 參考 > 加入參考 > Universal Windows > 擴充功能 > Windows Mobile Extensions for the UWP
UWP擴充功能
接著,請修改 UWP 原生專案內的 App.xaml.cs 檔案,在 OnLaunched 方法內,加入底下程式碼;在底下程式碼,您可以設定狀態列的背景與文字顏色和透明度等屬性。

App.xaml.cs

        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            //Mobile customization
            if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
            {

                var statusBar = StatusBar.GetForCurrentView();
                if (statusBar != null)
                {
                    statusBar.BackgroundOpacity = 1;
                    statusBar.BackgroundColor = Colors.Black;
                    statusBar.ForegroundColor = Colors.White;
                }
            }