XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2018/01/07

Xamarin.Forms / .NET Standard 體驗之旅5 : 彈出頁面Prism.Plugin.Popups

最近這段時間都在忙於公司相關事務上,因為最近幾天感冒,嚴重咳嗽,頭昏昏的,趁著今天有一點點好轉,繼續進行Xamarin.Forms / .NET Standard 體驗之旅5 的文章中,在這裡需要測試、使用我之前就很想使用的一個套件:Rg.Plugins.Popup。
Rg.Plugins.Popup 套件可以讓您設計的頁面,以彈出方式來顯示在手機螢幕,若此時,我們停用了手機上的實體回上頁按鈕功能,此時,使用者就必須完成該彈出視窗所指定要輸入的功能,或者在彈出視窗中點選取消按鈕,這樣,才會回到最初的螢幕頁面。
在下圖為我們的起始頁面,這個頁面上只有一個按鈕,這個時候,就會彈出我們設計需要使用者輸入帳號與密碼的彈出視窗。
Rg.Plugins.popup
下圖是彈出視窗的顯示結果,四周的綠色遮罩使用螢幕的方式來顯示,甚至連狀態列也會在遮罩顯示範圍,因此,您將看不到導航頁面的回上頁軟體按鈕,想要取消這個彈出視窗,需要點選紅色X圓圈,這樣,才會取消這個彈出視窗。
Rg.Plugins.popup
不過,想要做到這樣的功能,我們需要使用相當多的Code Behind程式碼來完成這樣的需求;在幾天之前,我看到了Prism.Plugin.Popups這個套件,它提供了擴充方法,可以讓我們使用Prism的導航物件服務,一樣可以做到彈出視窗的效果。

測試範例專案原始碼

這篇文章中的測試範例專案原始碼,您可以從這裡取得 https://github.com/vulcanlee/xamarin-forms-develop-notes-example/tree/master/XFPopup

開始建立專案

請點選功能表[檔案] > [新增] > [專案],此時,您會看到底下的[新增專案] 對話視窗。
我們點選Prism Template Pack 提供的Xamarin.Forms 專用的專案樣板,請點選[已安裝] > [Visual C#] > [Prism] > [Prism Blank App (Xamarin.Forms)]。
接著在名稱欄位輸入該專案名稱後,點選[確定] 按鈕,以建立此練習專案。
然後,在[PRISM PROJEC WIZAD] 對話窗中,選擇您要跨平台的作業系統,容器(Container) 這裡,我個人喜歡與習慣使用 Unity,您可以選擇您自己要用的容器,最後,點選[ CREATE PROJECT] 按鈕。
.NET Standard Xamarin.Forms Project

安裝Prism.Plugin.Popups.Unity NuGet 套件

在這裡,請使用滑鼠右建,點選剛剛建立好的共用類別庫(也就是.NET Standard 標準類別庫)節點,選擇[管理方案的NuGet 套件] 項目。
在[瀏覽]標籤頁次上,輸入Prism.Plugin.Popups.Unity這個關鍵字,搜尋出這個套件。請選擇Prism.Plugin.Popups.Unity這個套件,要來安裝到.NET Standard專案內。

首頁頁面按鈕事件

首頁頁面的XAML相當的簡單,因為,該頁面上只有一個按鈕,讓我們看看,如何顯示這個彈出視窗;當使用按下按鈕之後,我們需要呼叫_navigationService.PushPopupPageAsync這個方法,該方法是因為安裝了Prism.Plugin.Popups.Unity套件,所提供的擴充方法。
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace XFPopup.ViewModels
{

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

        public DelegateCommand OpenCommand { get; set; }

        private readonly INavigationService _navigationService;

        public MainPageViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;

            OpenCommand = new DelegateCommand(async () =>
            {
                var fooPara = new NavigationParameters();
                fooPara.Add("From", "從主頁面來彈出");
                await _navigationService.PushPopupPageAsync("NewPage1Page", fooPara);
            });
        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {

        }

        public void OnNavigatingTo(NavigationParameters parameters)
        {

        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {

        }

    }

}

新增彈出視窗頁面

接下來,我們需要新建立一個彈出視窗頁面,我們需要使用PopupPage類別來建立起可彈出的視窗頁面,而其他的設計方法,就如同我們在設計ContentPage相同。
<?xml version="1.0" encoding="utf-8" ?>
<pages:PopupPage 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:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup"
             xmlns:animations="clr-namespace:Rg.Plugins.Popup.Animations;assembly=Rg.Plugins.Popup"
             x:Class="XFPopup.Views.NewPage1Page"
             HasSystemPadding="False"
             >

    <pages:PopupPage.Resources>
        <ResourceDictionary>
            <Style x:Key="EntryStyle" TargetType="Entry">
                <Setter Property="PlaceholderColor" Value="#9cdaf1"/>
                <Setter Property="TextColor" Value="#7dbbe6"/>
            </Style>
        </ResourceDictionary>
    </pages:PopupPage.Resources>
    <pages:PopupPage.Animation>
        <animations:ScaleAnimation
      PositionIn="Bottom"
      PositionOut="Center"
      ScaleIn="1"
      ScaleOut="0.7"
      DurationIn="700"
      EasingIn="BounceOut"/>
    </pages:PopupPage.Animation>

    <Grid
        >
        <BoxView Color="YellowGreen" Opacity="0.6">
        </BoxView>
        <ScrollView
            HorizontalOptions="Center"
            VerticalOptions="Center">
            <Grid
                HorizontalOptions="Center">
                <StackLayout
                    HorizontalOptions="Center" VerticalOptions="Center"
                    BackgroundColor="White">
                    <StackLayout
                        IsClippedToBounds="True"
                        Spacing="3">
                        <Image
                            HorizontalOptions="Center"
                            x:Name="OctocatImage"
              Margin="10"
              HeightRequest="150"
              WidthRequest="150">
                            <Image.Source>
                                <OnPlatform
                  x:TypeArguments="ImageSource"
                  Android="github_octocat.png"
                  iOS="github_octocat.png"
                  WinPhone="Assets/github_octocat.png"/>
                            </Image.Source>
                        </Image>
                        <Label
                            HorizontalOptions="Center"
                            FontSize="20"
                            Text="{Binding From}"/>
                        <Entry
              HorizontalOptions="Center"
              x:Name="UsernameEntry"
              Style="{StaticResource EntryStyle}"
              Placeholder="Username" />
                        <Entry
              HorizontalOptions="Center"
              x:Name="PasswordEntry"
              Style="{StaticResource EntryStyle}"
              Placeholder="Password"
              IsPassword="True"/>
                        <Button
            Margin="10, 5"
            BackgroundColor="#7dbbe6"
            HorizontalOptions="Fill"
            Clicked="OnLogin"
            x:Name="LoginButton"
            Text="Login">
                        </Button>
                    </StackLayout>
                </StackLayout>
                <ContentView
                    HorizontalOptions="End" VerticalOptions="Start"
                >
                    <ContentView.GestureRecognizers>
                        <TapGestureRecognizer Tapped="OnCloseButtonTapped"/>
                    </ContentView.GestureRecognizers>
                    <Image
          x:Name="CloseImage"
          HeightRequest="30"
          WidthRequest="30">
                        <Image.Source>
                            <OnPlatform
              x:TypeArguments="ImageSource"
              Android="close_circle_button.png"
              iOS="close_circle_button.png"
              WinPhone="Assets/close_circle_button.png"/>
                        </Image.Source>
                    </Image>
                </ContentView>
            </Grid>
        </ScrollView>
    </Grid>
</pages:PopupPage>
接著我們打開彈出視窗頁面ViewModel檔案,修正ViewModel 的商業邏輯程式碼。
在這裡,我們展示的是使用Code Behind的方式,來關閉這個彈出視窗:await Navigation.PopAllPopupAsync();,當然,您也可以在ViewModel上來進行這樣效果的操作。
using Rg.Plugins.Popup.Pages;
using System;
using Xamarin.Forms;
using Rg.Plugins.Popup.Extensions;

namespace XFPopup.Views
{
    public partial class NewPage1Page : PopupPage
    {
        public NewPage1Page()
        {
            InitializeComponent();
        }

        protected override bool OnBackButtonPressed()
        {
            return true;
        }
        private async void OnLogin(object sender, EventArgs e)
        {
            //var loadingPage = new LoadingPopupPage();
            //await Navigation.PushPopupAsync(loadingPage);
            //await Task.Delay(2000);
            //await Navigation.RemovePopupPageAsync(loadingPage);
            //await Navigation.PushPopupAsync(new LoginSuccessPopupPage());
        }

        private void OnCloseButtonTapped(object sender, EventArgs e)
        {
            CloseAllPopup();
        }

        protected override bool OnBackgroundClicked()
        {
            CloseAllPopup();

            return false;
        }

        private async void CloseAllPopup()
        {
            await Navigation.PopAllPopupAsync();
        }

    }
}

2017/12/25

新課程 : 《台北》Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)

報名網址 《台北》Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)

學習

《台北》Xamarin.Forms 跨平台行動開發一日實戰營(派工 App)

活動時間:
2018-01-20(六) 09:00~17:00 (GMT+8)加入行事曆
相關連結:
本次課程包含 1.5 小時的線上課程與 1 天實體課程,將會帶領大家從無到有,開發出一個派工與回報的後台 Web API 專案與跨平台(Android / iOS)行動應用 App。
活動介紹

◎ 課程說明

以往想要開發原生行動應用程式,您必須要遵循每個平台的 SDK 規範與了解應用程式的生命週期,並且使用專屬程式語言與 API 使用方式,例如: iOS 需要學習 Swift 或者 Objective-C,而 Android 必須要學習 Java,這使得想要開發一套能夠在不同行動裝置下運行的應用程式,您必須學習與精通這些開發工具與程式語言;最重要的是,不論是視覺介面 UI 或者商業邏輯程式碼,都無法跨平台共用,也就是說,同樣的商業邏輯需要使用不同程式語言重覆再寫一次。  
Xamarin.Forms 使用 .NET C# 程式語言,配合豐富資源 BCL 與視覺宣告 XAML 語言,搭配地表最強的程式開發工具 Visual Studio,讓您可以一次性開發出可以在 iOS & Android & UWP 下運行的行動裝置應用程式,不論是視覺介面與商業邏輯,開發者也只需要撰寫一次即可,就可以產生出在不同行動裝置下執行的應用程式。另外,Xamarin.Forms 特別適合用於開發企業內部的行動應用。  
本次課程包含 1.5 小時的線上課程1 天實體課程,使用派工與回報的後台 Web API 專案﹐帶領大家從無到有,實作出跨平台(Android / iOS)行動應用 App。

◎ 課程編號

  • DCT-107001

◎ 課程日期

  • 2018/01/20 (六)
  • 09:00~17:00 (中午休息一個小時)

◎ 課程主題

  • 1.5 小時線上課程中,內容將包含
    • Visual Studio 2017 之 Xamarin.Forms 開發環境的安裝與設定
    • 如何安裝與使用 Xamarin.Forms 開發用程式碼片段
    • 安裝 Prism Template Pack 擴充功能
    • 使用 GitHub 分享有問題的專案原始碼
    • XAML 基本特色與功能介紹
    • 確認開發環境是否正常運作
      • VS for Android 模擬器是否正常運作
      • 實體 Android 手機 啟用開發者模式
      • Android SDK 管理員更新到最新版本
      • 建立、建置、執行 Cross-Platform 專案
      • 建立、建置、執行 Prism 專案
      • 安裝 Prism Template Pack 擴充功能
      • 如何安裝與使用 Xamarin.Forms 開發用程式碼片段
  • 在實體課程中,學員將會體驗進行底下的各種開發工作
    • 系統啟動頁面與網路連線狀態檢查
    • 使用者登入與身分驗證檢查
    • 根據登入使用者,下載屬於該使用者的派工單
    • 根據每項工作定義,進行定點簽到 (GPS 定位,掃 QR Code 條碼)
    • 可以輸入額外資訊到派工單上與進行儲存
    • 使用者可以進行拍照或選取相簿,並且透過網路上傳到後端,之後顯示在手機上
    • 工作完成後,可以上傳通知後台(之後該派工單將無法進行修改)
    • 可以查詢最近 7 天的歷史派工單資料
    • 登入作業
    • App 打包與部署 

2017/12/11

在 Visual Studio for Android Emulator 6.0 模擬器上安裝 Google Play Services GApps

在這裡,將會說明如何在 Visual Studio for Android Emulator 6.0 模擬器上,安裝與使用 Google Play Service,經過這樣的程序,您就可以在這個模擬器上,使用 Google Play Service 的相關服務與軟體了。
我們在這裡新下載與安裝了一個新的 Visual Studio for Android Emulator
Visual Studio for Android Emulator

下載與安裝 Genymotion-ARM-Tran

slation_v1.1.zip
我們需要先下載 Genymotion-ARM-Translation_v1.1.zip 這個檔案,下載完成後,請使用檔案總管拖拉到模擬器上,並且放開,這樣就會在模擬器上開始進行安裝這個 ARM 指令集轉換工具了。在這裡,您只需要點選 [Install and shut down] 按鈕,即會開始進行安裝了。
Genymotion ARM Tran
當安裝完成後,點選 [OK] 按鈕,就會關閉模擬器,此時,我們就可以重新再度啟動模擬器即可。
Genymotion ARM Tran reboot
Genymotion ARM Tran reboot

下載與安裝 gapps-L-4-21-15.zip

接著,您需要下載這個檔案 gapps-L-4-21-15.zip 這個檔案,下載完成後,請使用檔案總管拖拉到模擬器上,並且放開,這樣就會在模擬器上開始進行安裝這個 Google Play Service 了。在這裡,您只需要點選 [Install and shut down] 按鈕,即會開始進行安裝了。
安裝 GApps
當安裝完成後,點選 [OK] 按鈕,就會關閉模擬器,此時,我們就可以重新再度啟動模擬器即可。
安裝 GApps reboot
安裝 GApps reboot
當重新開機之後,您可以看到模擬器會正在進行相關軟體的最佳化設定工作。
安裝 GApps reboot

設定 GApps

一旦我們安裝好 GApps 軟體之後,請開啟 Google Play 軟體
開啟 Google Play 軟體
接著,請進行登入與驗證您的 Google 帳號,便可以在模擬器上啟用 Google Play 服務了。
開啟 Google Play 軟體
啟用帳號完成好了,就會看到 Google Play 軟體,畫面如下。
開啟 Google Play 軟體
此時,您會看到這樣的錯誤訊息 [Unfortunately, Google Play Service has stopped] ,您可以先忽略掉這個錯誤訊息,等下我們會修正。
開啟 Google Play 軟體
點選漢堡按鈕,將會看到底下的畫面,此時,若您點選 [Settings]
開啟 Google Play 軟體
在 [Setting] 畫面中,找到最後面的 [Build Versio] 這個欄位,點選它
開啟 Google Play 軟體
將會看到 [A new version of Google Play Store will be downloaded and installed] 訊息,點選 [OK] 按鈕。
開啟 Google Play 軟體
一旦 Google apps 都完成更新 (您可以選擇重新啟動模擬器,或者將 Google Play Server 應用程式強制停止運行(使用長按 Option 實體按鍵)),這個時候,進入到程式集中,您會看到 [Play Store] 的圖示已經更新了,這表示,Google Play Service 已經升級到最新版本。
開啟 Google Play 軟體
進入到 Google Paly 應用程式內,將會看到最新版本的 Google Play 應用程式畫面。
開啟 Google Play 軟體
開啟 Google Play 軟體

修正 Google Play 服務異常當掉的問題

為了要修正這個問題,我們需要下載 benzo-gapps-M-20151011-signed-chroma-r3.zip 這個檔案,並且安裝到模擬器上;因此,當下載完成這個檔案之後,請使用檔案總管拖拉到模擬器上,並且放開,這樣就會在模擬器上開始進行安裝。在這裡,您只需要點選 [Install and shut down] 按鈕,即會開始進行安裝了。
benzo-gapps-M-20151011-signed-chroma-r3.zip
benzo-gapps-M-20151011-signed-chroma-r3.zip
當安裝完成後,點選 [OK] 按鈕,就會關閉模擬器,此時,我們就可以重新再度啟動模擬器即可。
benzo-gapps-M-20151011-signed-chroma-r3.zip

完成安裝與設定

若您看到這裡,則表示您已經完成 Google Play 服務的安裝與設定工作了。
現在,您可以啟動 Google Play 應用程式,進入到設定頁面,點選 [Play Store version] 項目,就會看到現在使用的是最新版本而且再也不會看到錯誤訊息了。
GApps Google Play Service on Visual Studio for Android Emulator

2017/11/22

Xamarin.Forms / .NET Standard 體驗之旅 4 : QR Code 條碼掃描

對於已經具備擁有 .NET / C# 開發技能的開發者,可以使用 Xamarin.Forms Toolkit 開發工具,便可以立即開發出可以在 Android / iOS 平台上執行的 App;對於要學習如何使用 Xamarin.Forms & XAML 技能,現在已經推出兩本電子書來幫助大家學這這個開發技術。
這兩本電子書內包含了豐富的逐步開發教學內容與相關觀念、各種練習範例,歡迎各位購買。
Xamarin.Forms 電子書
想要購買 Xamarin.Forms 快速上手 電子書,請點選 這裡

想要購買 XAML in Xamarin.Forms 基礎篇 電子書,請點選 這裡


在 Xamarin.Forms / .NET Standard 體驗之旅 4 的文章中,我們將要來測試每次進行 Xamarin.Forms 實戰課程,大家最想要學習與使用的這個 NuGet 套件:ZXing.Net.Mobile,也就是要開發出具有跨平台的條碼掃描程式。
我們從這個套件在 NuGet 官網上的內容可以看的出來,這個 NuGet 套件尚未支援 .NET Standard 標準類別庫,而是之前的可攜式 PCL 類別庫,不過,因為 .NET Standard 2.0 類別庫也支援可以使用 PCL 類別庫,因此,我們來測試看看,這個套件可否用於 Prism Template Pack 2.0.7 產生的 Xamarin.Forms 跨平台專案,並且進行一維條碼或者二維條碼 QR Code。
Realm NuGet

測試範例專案原始碼

這篇文章中的測試範例專案原始碼,您可以從這裡取得 https://github.com/vulcanlee/xamarin-forms-develop-notes-example/tree/master/XFQRCode

開始建立專案

請點選功能表 [檔案] > [新增] > [專案],此時,您會看到底下的 [新增專案] 對話視窗。
我們點選 Prism Template Pack 提供的 Xamarin.Forms 專用的專案樣板,請點選 [已安裝] > [Visual C#] > [Prism] > [Prism Blank App (Xamarin.Forms)]。
接著在名稱欄位輸入該專案名稱後,點選 [確定] 按鈕,以建立此練習專案。
然後,在 [PRISM PROJEC WIZAD] 對話窗中,選擇您要跨平台的作業系統,容器 (Container) 這裡,我個人喜歡與習慣使用 Prism,您可以選擇您自己要用的容器,最後,點選 [CREATE PROJECT] 按鈕。
.NET Standard Xamarin.Forms Project

安裝 ZXing.Net.Mobile.Forms NuGet 套件

在這裡,請使用滑鼠右建,點選剛剛建立好的共用類別庫(也就是 .NET Standard 標準類別庫)節點,選擇 [管理方案的 NuGet 套件] 項目。
在 [瀏覽] 標籤頁次上,輸入 ZXing.Net.Mobile 這個關鍵字,搜尋出這個套件。請選擇 ZXing.Net.Mobile.Forms 這個套件,要來安裝到 .NET Standard 專案內。
從下圖中,我們可以看到這個套件並不支援 .NET Standard,不過,我們還是要把這個套件安裝到 .NET Standard 專案內。
ZXing.Net.Mobile.Forms
當我們點選 [安裝] 按鈕之後,會看到 Visual Studio 會提示您這樣會安裝那些相依性的套件。
.NET Standard Xamarin.Forms Project

修正首頁頁面

我們對於這個應用程式的設計構想是這樣的,當這個應用程式一旦啟動,會在螢幕上顯示一個按鈕,和一些 Label 欄位,這些 Label 欄位是要用來顯示掃描到的條碼資訊。因此,當使用者按下 Scan... 按鈕之後,就會切換到另外一個頁面,這個頁面將會使用 ZXingScannerView 用來進行協助我們做到條碼掃描的工作。
安裝好套件之後,讓我們打開 MainPage.xaml 檔案,修改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"
             x:Class="XFQRCode.Views.MainPage"
             Title="ZXing.Net.Mobile 條碼掃描">

    <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
        <Label Text="Welcome to Xamarin Forms and Prism!" />
        <Label
            Text="條碼類型"/>
        <Label
            Text="{Binding BarcodeFormatType}"/>
        <Label
            Text="{Binding BarcodeResult}"/>
        <Button
            Text="Scan..."
            Command="{Binding ScanCommand}"/>
    </StackLayout>

</ContentPage>
接著我們打開 MainPageViewModel.cs 檔案,修正 ViewModel 的商業邏輯程式碼。
這裡特別說明的是,當掃描條碼的頁面有掃描到結果,我們是透過頁面導航機制提供的相關事件,進行讀取來自掃描頁面的掃描結果。因此,您可以觀察 OnNavigatingTo 方法,我們將會透過比對 parameters.ContainsKey("Result")表示式,確認該事件可以讀取掃描結果內容。
namespace XFQRCode.ViewModels
{

    public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public string BarcodeFormatType { get; set; }
        public string BarcodeResult { get; set; }

        public DelegateCommand ScanCommand { get; set; }

        private readonly INavigationService _navigationService;

        public MainPageViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;

            ScanCommand = new DelegateCommand(() =>
            {
                _navigationService.NavigateAsync("ScanPage");
            });
        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {

        }

        public void OnNavigatingTo(NavigationParameters parameters)
        {
            if(parameters.ContainsKey("Result"))
            {
                var fooReslut = parameters["Result"] as Result;
                BarcodeFormatType = fooReslut.BarcodeFormat.ToString();
                BarcodeResult = fooReslut.Text;
            }
        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {

        }

    }

}

新增條碼頁面

接下來,我們需要新建立一個頁面,ScanPage,我們將會在這個頁面上使用 ZXingScannerView 用來進行協助我們做到條碼掃描的工作。
當新增完成 ScanPage 頁面,讓我們打開 ScanPage.xaml 檔案,修改XAML內容。
首先我們先宣告一個新的命名空間,xmlns:Zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms",這樣,我們就可以使用這個命名空間前置詞參考到這個 ZXingScannerView 控制項。
<?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"
             xmlns:Zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="XFQRCode.Views.ScanPage"
             Title="進行條碼掃描中..."
             >

    <Grid
        >
        <Zxing:ZXingScannerView
            HorizontalOptions="Fill"
            IsAnalyzing="{Binding IsAnalyzing}"
            IsScanning="{Binding IsScanning}"
            Result="{Binding ScanResult, Mode=TwoWay}" 
            ScanResultCommand="{Binding ScanResultCommand}"
             />
        <Zxing:ZXingDefaultOverlay Opacity="0.9" ShowFlashButton="False" />
    </Grid>
</ContentPage>
接著我們打開 ScanPageViewModel.cs 檔案,修正 ViewModel 的商業邏輯程式碼。
一旦條碼有掃描到之後,將會執行 ScanResultCommand 的委派方法,不過,您需要特別注意,我們需要使用 Device.BeginInvokeOnMainThread 方法,將您要執行的程式碼,全部都指定在 UI (Main) Thread 上運行。
namespace XFQRCode.ViewModels
{

    public class ScanPageViewModel : INotifyPropertyChanged, INavigationAware
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public bool IsAnalyzing { get; set; } = true;
        public bool IsScanning { get; set; } = true;
        public Result ScanResult { get; set; }
        private readonly INavigationService _navigationService;

        public DelegateCommand ScanResultCommand { get; set; }

        public ScanPageViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;


            ScanResultCommand = new DelegateCommand(async () =>
            {
                Device.BeginInvokeOnMainThread(async () =>
                {
                    IsAnalyzing = false;
                    IsScanning = false;
                    var fooPara = new NavigationParameters();
                    fooPara.Add("Result", ScanResult);
                    // 回到上頁,並且把掃描結果帶回去
                    await _navigationService.GoBackAsync(fooPara);
                });
            });
        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {

        }

        public void OnNavigatingTo(NavigationParameters parameters)
        {

        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {

        }

    }
}

進行測試

最後,設定預設起始專案為 Android 專案,並且需要使用實體手機來進行測試。

Acr.UserDialogs 執行結果 Acr.UserDialogs 執行結果


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