XAML in Xamarin.Forms 基礎篇 電子書

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

Xamarin.Forms 快速入門 電子書

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

2019/04/26

使用 StackLayout 配合 BindableLayout.ItemTemplateSelector 建立一個動態資料樣板的呈現的效果

使用 StackLayout 配合 BindableLayout.ItemTemplateSelector 建立一個動態資料樣板的呈現的效果

在 Xamarin.Forms 3.5 版本推出的時候,有一個相當好用的功能,那就是 BindableLayout ,有興趣的人可以參考 Xamarin.Forms 3.5: A Little Bindable Love 這篇文章,只要是版面配置繼承於 Layout ,都可以使用 BindableLayout 這個附加屬性 Attached Property,這包括了:AbsoluteLayuot, FlexLayout, Grid, RelativeLayout, StackLayout。
在這篇文章中,將要來練習使用 StackLayout 這個版面配置,但是不會在 StackLayout 版面配置內指定這些仔檢視,而是透過 BindableLayout.ItemsSource 來指定要顯示在 StackLayout 內的子檢視 View 的物件,並且每個子檢視的樣貌都會不相同,會依據當時該物件值來決定要顯示甚麼樣貌,也就是要顯示哪個 DataTemplate,所以,這裡將會使用 BindableLayout.ItemTemplateSelector
該文件的專案原始碼可以透過 GitHub 來取得

建立一個 使用 StackLayout 專案

  • 開啟 Visual Studio 2019 程式
  • 當 Visual Studio 2019 開始 視窗 出現之後,請點選左下角的 [建立新專案] 選項
  • 當 [建立新專案] 對話窗出現之後,請在中間最上方的搜尋文字輸入盒中輸入 [prism] 關鍵字,搜尋所有與 Prism 有關的專案樣板
  • 請選擇 [Prism Blank App (Xamarin.Forms)] 這個專案樣板
  • 當出現 [設定新的專案] 對話窗,請在 [專案名稱] 輸入 [XF3003]
  • 最後點選該對話窗右下方的 [建立] 按鈕
  • 現在將會看到 [PRISM PROJECT WIZARD] 對話窗,請勾選 ANDROID, iOS, UWP 三個行動裝置平台,接著在底下 [Container] 下拉選單,選擇 Unity 項目
  • 最後,點選 [CREATE PROJECT] 按鈕,以便產生 Xamarin.Forms 專案

安裝需要用到的 PropertyChanged.Fody NuGet 套件

  • 當這個 Xamarin.Forms 專案建立成功之後,請在該方案中,找到 Xamarin.Forms 使用的專案(這是一個 .NET Standard 類別庫,簡稱為 SCL ),請在該專案中,使用滑鼠右擊 [相依性] 節點,選擇 [管理 NuGet 套件] 選項
  • 在 [NuGet: XXX] 視窗中,點選 [瀏覽] 標籤頁次,並且在下方的搜尋文字輸入盒中,輸入 [propertychanged.fody] 關鍵字,搜尋出這個 NuGet 套件
  • 當出現 [PropertyChanged.Fody] NuGet 套件,請點選該套件,並且點選右方的 [安裝] 按鈕,將這個套件安裝到 Xamarin.Forms 專案內
  • 請查看 Xamarin.Forms 專案內,並沒有 [FodyWeavers.xml] 這個檔案,因此,使用滑鼠右擊 Xamarin.Forms 專案節點,選擇 [建置] 選項
  • 當建置完成之後,在這個 Xamarin.Forms 專案內將會出現 [FodyWeavers.xml] 檔案

升級 Xamarin.Forms 套件到大於 3.5 板本以上

因為 BindableLayout 將會在 Xamarin.Forms 3.5 版才有支援,因此,現在這個時間點,將會升級到最新的 3.6 版本
  • 使用滑鼠右擊方案節點(方案總管最上方的那個節點),選擇 [管理方案的 NuGet 套件]
  • 點選 [更新] 標籤頁次
  • 勾選該標籤頁次內的所有項目
  • 點選右上方的更新按鈕,就可以升級這些套件到最新版本了

建立資料模型

  • 滑鼠右擊 Xamarin.Forms 專案,選擇 [加入] > [新增資料夾]
  • 將新增資料夾的名稱設定為 [Models]
  • 滑鼠右擊剛剛建立的 [Models] 資料夾,選擇 [加入] > [類別]
  • 在 [新增項目] 對話窗下方的 [名稱] 欄位中,輸入 [ItemBlock]
  • 點選右下方的 [新增] 按鈕
  • 將底下程式碼填入到這個新建立的類別檔案內
C Sharp / C#
namespace XF3003.Models
{
    public enum ItemBlockTypeEnum
    {
        Label,
        BoxView,
        Entry,
    }
    public class ItemBlock
    {
        public ItemBlockTypeEnum ShowViewType { get; set; }
        public string LabelText { get; set; }
        public int CountIndex { get; set; }
    }
}

建立資料樣板選擇器的類別

  • 滑鼠右擊 Xamarin.Forms 專案,選擇 [加入] > [新增資料夾]
  • 將新增資料夾的名稱設定為 [DataTemplateSelectors]
  • 滑鼠右擊剛剛建立的 [DataTemplateSelectors] 資料夾,選擇 [加入] > [類別]
  • 在 [新增項目] 對話窗下方的 [名稱] 欄位中,輸入 [MyItemTemplateSelector]
  • 點選右下方的 [新增] 按鈕
  • 將底下程式碼填入到這個新建立的類別檔案內
這個 MyItemTemplateSelector 類別將需要繼承 DataTemplateSelector 這個類別,並且要覆寫實作出 OnSelectTemplate 這個方法,而這個方法的主要作用在於會接收一個型別為 object 的 item 物件,該物件就是當時要顯示在螢幕上的物件,這個時候,可以根據該物件屬性值,決定當時要顯示出哪個資料樣板 DataTemplate,如此,就可以做出動態顯示不同檢視項目的效果了。
在這個類別類,將會宣告三個 DataTemplate 屬性,這三個 DataTemplate 屬性將會在該頁面的 XAML 中來宣告與指定,因此,在這裡將不會有任何的定義。
C Sharp / C#
public class MyItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate LabelDataTemplate { get; set; }
    public DataTemplate BoxViewDataTemplate { get; set; }
    public DataTemplate EntryDataTemplate { get; set; }
    protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
    {
        ItemBlock foo = (ItemBlock)item;
        if (foo.ShowViewType == ItemBlockTypeEnum.Label)
        {
            return LabelDataTemplate;
        }
        else if (foo.ShowViewType == ItemBlockTypeEnum.BoxView)
        {
            return BoxViewDataTemplate;
        }
        else
        {
            return EntryDataTemplate;
        }
    }
}

建立使用 BindableLayout.ItemTemplateSelector 的頁面與商業邏輯

  • 在 [Views] 資料夾內,打開 [MainPage.xaml] 檔案
  • 修正使用底下的 XAML 語言宣告
在這裡將會看到在 StackLayout 版面配置內,並沒有指定任何的子檢視,而是透過 BindableLayout.ItemsSource 來指定要顯示的物件,而該物件要顯示那些 XAML 檢視項目,這裡是透過 BindableLayout.ItemTemplateSelector 來決定。
設計技巧就是要使用到 XAML 的 資源 Resource,在此會使用 ContentPage.Resources 來宣告這些資源;在前面提到過的三種資料樣板 LabelDataTemplate BoxViewDataTemplate EntryDataTemplate 將會在這裡進行定義,另外,也需要建立一個 XAML 命名空間 xmlns:LocalDataTemplates="clr-namespace:XF3003.DataTemplateSelectors" ,將會透過該命名空間可以參考到上面所設計的 MyItemTemplateSelector 類別,也會在這裡分別指定該類別中的三個屬性所要參考的物件值。
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:LocalDataTemplates="clr-namespace:XF3003.DataTemplateSelectors"
             x:Class="XF3003.Views.MainPage"
             Title="StackLayout的ItemTemplateSelector 應用練習">

    <ContentPage.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="labelTemplate">
                <Grid>
                    <Label Text="{Binding LabelText}"/>
                </Grid>
            </DataTemplate>
            <DataTemplate x:Key="boxViewTemplate">
                <Grid>
                    <BoxView Color="LightPink"/>
                </Grid>
            </DataTemplate>
            <DataTemplate x:Key="entryTemplate">
                <Grid>
                    <Entry Placeholder="{Binding LabelText}"/>
                </Grid>
            </DataTemplate>
            <LocalDataTemplates:MyItemTemplateSelector 
                x:Key="myItemTemplateSelector"
                LabelDataTemplate="{StaticResource labelTemplate}"
                BoxViewDataTemplate="{StaticResource boxViewTemplate}"
                EntryDataTemplate="{StaticResource entryTemplate}"/>
        </ResourceDictionary>
    </ContentPage.Resources>

    <Grid>
        <StackLayout
            Orientation="Vertical"
            BindableLayout.ItemsSource="{Binding myItemList}"
            BindableLayout.ItemTemplateSelector="{StaticResource myItemTemplateSelector}">
        </StackLayout>
    </Grid>
</ContentPage>
  • 在 [ViewModels] 資料夾內,打開 [MainPageViewModel.xaml] 檔案
  • 修正使用底下的 C# 程式碼
C Sharp / C#
namespace XF3003.ViewModels
{
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using Prism.Events;
    using Prism.Navigation;
    using Prism.Services;
    using XF3003.Models;

    public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public ObservableCollection<ItemBlock> myItemList { get; set; } = new ObservableCollection<ItemBlock>();
        private readonly INavigationService navigationService;

        public MainPageViewModel(INavigationService navigationService)
        {
            this.navigationService = navigationService;

        }

        public void OnNavigatedFrom(INavigationParameters parameters)
        {
        }

        public void OnNavigatedTo(INavigationParameters parameters)
        {
            myItemList.Add(new ItemBlock()
            {
                ShowViewType = ItemBlockTypeEnum.Label,
                LabelText = "User Account"
            });
            myItemList.Add(new ItemBlock()
            {
                ShowViewType = ItemBlockTypeEnum.Entry,
                LabelText = "Please Enter Account"
            });
            myItemList.Add(new ItemBlock()
            {
                ShowViewType = ItemBlockTypeEnum.Label,
                LabelText = "User Password"
            });
            myItemList.Add(new ItemBlock()
            {
                ShowViewType = ItemBlockTypeEnum.Entry,
                LabelText = "Please Enter Password"
            });
            myItemList.Add(new ItemBlock()
            {
                ShowViewType = ItemBlockTypeEnum.BoxView,
            });
        }

        public void OnNavigatingTo(INavigationParameters parameters)
        {
        }

    }
}

執行結果




2019/04/25

使用 CollectionView 建立一個能以 GridView 呈現的效果

使用 CollectionView 建立一個能以 GridView 呈現的效果

CollectionView 現階段還是在 Preview 階段,當 Xamarin.Forms 4.0 (現階段 Xamarin.Forms 的版本是 3.6) 正式推出的時候,將可以使用這個 CollectionView 檢視。這個檢視除了具有 ListView 的功能之外,它還可以使用 GridView 的模式來顯示出每筆資料,現在,就來實際建立這個專案來體驗設計過程吧。
該文件的專案原始碼可以透過 GitHub 來取得

建立一個 使使用 FlexLayout 專案

  • 開啟 Visual Studio 2019 程式
  • 當 Visual Studio 2019 開始 視窗 出現之後,請點選左下角的 [建立新專案] 選項
  • 當 [建立新專案] 對話窗出現之後,請在中間最上方的搜尋文字輸入盒中輸入 [prism] 關鍵字,搜尋所有與 Prism 有關的專案樣板
  • 請選擇 [Prism Blank App (Xamarin.Forms)] 這個專案樣板
  • 當出現 [設定新的專案] 對話窗,請在 [專案名稱] 輸入 [XF3002]
  • 最後點選該對話窗右下方的 [建立] 按鈕
  • 現在將會看到 [PRISM PROJECT WIZARD] 對話窗,請勾選 ANDROID, iOS 這兩個行動裝置平台,接著在底下 [Container] 下拉選單,選擇 Unity 項目
  • 最後,點選 [CREATE PROJECT] 按鈕,以便產生 Xamarin.Forms 專案

安裝需要用到的 PropertyChanged.Fody NuGet 套件

  • 當這個 Xamarin.Forms 專案建立成功之後,請在該方案中,找到 Xamarin.Forms 使用的專案(這是一個 .NET Standard 類別庫,簡稱為 SCL ),請在該專案中,使用滑鼠右擊 [相依性] 節點,選擇 [管理 NuGet 套件] 選項
  • 在 [NuGet: XXX] 視窗中,點選 [瀏覽] 標籤頁次,並且在下方的搜尋文字輸入盒中,輸入 [propertychanged.fody] 關鍵字,搜尋出這個 NuGet 套件
  • 當出現 [PropertyChanged.Fody] NuGet 套件,請點選該套件,並且點選右方的 [安裝] 按鈕,將這個套件安裝到 Xamarin.Forms 專案內
  • 請查看 Xamarin.Forms 專案內,並沒有 [FodyWeavers.xml] 這個檔案,因此,使用滑鼠右擊 Xamarin.Forms 專案節點,選擇 [建置] 選項
  • 當建置完成之後,在這個 Xamarin.Forms 專案內將會出現 [FodyWeavers.xml] 檔案

安裝需要用到的 Xamarin.Essentials NuGet 套件

  • 在 [NuGet: XXX] 視窗中,搜尋文字輸入盒中,輸入 [Xamarin.Essentials] 關鍵字,搜尋出這個 NuGet 套件
  • 當出現 [Xamarin.Essentials] NuGet 套件,請點選該套件,並且點選右方的 [安裝] 按鈕,將這個套件安裝到 Xamarin.Forms 專案內

修正因為安裝 Xamarin.Essentials 帶來的錯誤

現在,可以從 Visual Studio 2019 的錯誤視窗中,看到底下的錯誤訊息
錯誤    NU1107    偵測到 Xamarin.Android.Support.Compat 有版本衝突。請將 Xamarin.Android.Support.Compat 28.0.0.1 直接安裝/參考到專案 XF3002.Android 來解決此問題。 
 XF3002.Android -> XF3002 -> Xamarin.Essentials 1.1.0 -> Xamarin.Android.Support.Compat (>= 28.0.0.1) 
 XF3002.Android -> Xamarin.Android.Support.Design 27.0.2.1 -> Xamarin.Android.Support.Compat (= 27.0.2.1).    XF3002.Android    D:\Vulcan\GitHub\XCourse19\XF3002\XF3002\XF3002.Android\XF3002.Android.csproj    1
想要解決此一問題:
  • 使用滑鼠右擊方案節點(方案總管最上方的那個節點),選擇 [管理方案的 NuGet 套件]
  • 點選 [更新] 標籤頁次
  • 勾選該標籤頁次內的所有項目
  • 點選右上方的更新按鈕,就可以升級這些套件到最新版本了

升級 Xamarin.Forms 套件到 4.0 版本

  • 同樣的,使用滑鼠右擊方案節點(方案總管最上方的那個節點),選擇 [管理方案的 NuGet 套件]
  • 點選 [已安裝] 標籤頁次
  • 點選 [Xamarin.Forms] 套件項目
  • 勾選 [包括搶鮮版] 檢查盒,要求顯示搶鮮版的套件清單
  • 在右方的 Xamarin.Forms 套件清單中,勾選所有的專案
  • 在下方的版本下拉選單中,選擇 4.0 以上的版本,現階段只能夠看到 4.0.0.346134-pre9 這個版本
  • 點選右下方 [安裝] 按鈕,將這個 4.0 的 Xamarin.Forms 套件安裝到所有專案內

建立資料模型

  • 滑鼠右擊 Xamarin.Forms 專案,選擇 [加入] > [新增資料夾]
  • 將新增資料夾的名稱設定為 [Models]
  • 滑鼠右擊剛剛建立的 [Models] 資料夾,選擇 [加入] > [類別]
  • 在 [新增項目] 對話窗下方的 [名稱] 欄位中,輸入 [MyData]
  • 點選右下方的 [新增] 按鈕
  • 將底下程式碼填入到這個新建立的類別檔案內
C Sharp / C#
public class MyData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public string Name { get; set; }
    public int OrderId { get; set; }
}

修正該 Android 專案的 MainActivity.cs

因為現階段 CollectionView 還是在預覽階段,所以,需要在原生專案的進入點內,要執行 Xamarin.Forms.Forms.Init 這個方法前,要增加先執行底下的方法。
  • 打開 [MainActivity.cs] 檔案
  • 將第 18 行,此行沒有任何程式碼,在此加入這個 C# 敘述 Xamarin.Forms.Forms.SetFlags("CollectionView_Experimental");

建立使用 CollectionView 的頁面與商業邏輯

  • 在 [Views] 資料夾內,打開 [MainPage.xaml] 檔案
  • 修正使用底下的 XAML 語言宣告
在這裡的 CollectionView 將會透過 [ItemsSource] 這個可綁定屬性,從 ViewModel 物件內取得要顯示的清單集合資料,並且使用 [SelectionMode] 屬性,設定使用者僅能夠使用單選的方式來選取,最後透過 [SelectionChangedCommand] 這個命令,綁定到 ViewModel 內的 ICommand 屬性,也就是當使用者點選任一項目之後,將會觸發這個命令。
在 CollectionView 內,可以使用 [CollectionView.ItemsLayout] 來設定此次要顯示的資料格式,在這裡將會使用 [GridItemsLayout] 這個屬性來指定使用 GridView 的模式來呈現,並且是以垂直方式來顯示資料。
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="XF3002.Views.MainPage"
             Title="CollectionView 的應用練習">

    <StackLayout
        >
        <CollectionView
            x:Name="cv"
            ItemsSource="{Binding myItemList}"
            SelectionMode="Single"
            SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
            SelectionChangedCommand="{Binding SelectionChangedCommand}"
            >
            <CollectionView.ItemsLayout>
                <GridItemsLayout Orientation="Vertical" Span="2" />
            </CollectionView.ItemsLayout>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Frame BorderColor="LightGray" CornerRadius="3" HasShadow="False">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="70"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="150"/>
                            </Grid.ColumnDefinitions>
                            <Label
                                HorizontalOptions="Start"
                                Text="{Binding Name}"
                                FontAttributes="Bold"
                                FontSize="20"/>
                            <Label
                                HorizontalOptions="End" VerticalOptions="End"
                                Text="{Binding OrderId}"
                                TextColor="Red"
                                FontSize="16"/>
                        </Grid>
                    </Frame>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

</ContentPage>
  • 在 [ViewModels] 資料夾內,打開 [MainPageViewModel.xaml] 檔案
  • 修正使用底下的 C# 程式碼
C Sharp / C#
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XF3002.ViewModels
{
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using Prism.Events;
    using Prism.Navigation;
    using Prism.Services;
    using XF3002.Models;

    public class MainPageViewModel : INotifyPropertyChanged, INavigationAware
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public ObservableCollection<MyData> myItemList { get; set; } = new ObservableCollection<MyData>();
        public MyData SelectedItem { get; set; }
        public int GridItemsLayoutSpan { get; set; } = 2;
        public DelegateCommand SelectionChangedCommand { get; set; }
        private readonly INavigationService navigationService;
        private readonly IPageDialogService dialogService;

        public MainPageViewModel()
        {
            ReadData();
        }
        public MainPageViewModel(INavigationService navigationService, IPageDialogService dialogService)
        {
            this.navigationService = navigationService;
            this.dialogService = dialogService;
            SelectionChangedCommand = new DelegateCommand(() =>
            {
                dialogService.DisplayAlertAsync("Info", SelectedItem.Name, "OK");
            });
        }

        public void OnNavigatedFrom(INavigationParameters parameters)
        {
        }

        public void OnNavigatedTo(INavigationParameters parameters)
        {
            ReadData();
        }

        public void OnNavigatingTo(INavigationParameters parameters)
        {
        }
        public void ReadData()
        {
            int cc = 1;
            for (int i = 0; i < 10; i++)
            {
                myItemList.Add(new MyData() { Name = "Baboon", OrderId=cc++ });
                myItemList.Add(new MyData() { Name = "Capuchin Monkey", OrderId = cc++ });
                myItemList.Add(new MyData() { Name = "Blue Monkey", OrderId = cc++ });
                myItemList.Add(new MyData() { Name = "Squirrel Monkey", OrderId = cc++ });
                myItemList.Add(new MyData() { Name = "Golden Lion Tamarin", OrderId = cc++ });
                myItemList.Add(new MyData() { Name = "Howler Monkey", OrderId = cc++ });
                myItemList.Add(new MyData() { Name = "Japanese Macaque", OrderId = cc++ });
            }
        }
    }
}

執行結果




2019/04/24

解決要建置 Xamarin.Forms 專案,發生 ResolveLibraryProjectImports 與 LinkAssemblies 和 參考 `Xamarin.Forms.Xaml` 的問題

解決要建置 Xamarin.Forms 專案,發生 ResolveLibraryProjectImports 的問題


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

有時候當建立好一個 Xamarin.Forms 專案,撰寫了一些程式碼之後,準備要進行建置該專案的動作,此時,會得到這樣的錯誤訊息
嚴重性    程式碼    說明    專案    檔案    行    隱藏項目狀態
錯誤        "ResolveLibraryProjectImports" 工作發生未預期的失敗。
System.IO.FileNotFoundException: Could not load assembly 'XF2001, Version=0.0.0.0, Culture=neutral, PublicKeyToken='. Perhaps it doesn't exist in the Mono for Android profile?
檔案名稱: 'XF2001.dll'
   於 Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)
   於 Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(String fullName)
   於 Xamarin.Android.Tasks.ResolveLibraryProjectImports.Extract(DirectoryAssemblyResolver res, ICollection`1 jars, ICollection`1 resolvedResourceDirectories, ICollection`1 resolvedAssetDirectories, ICollection`1 resolvedEnvironments)
   於 Xamarin.Android.Tasks.ResolveLibraryProjectImports.Execute()
   於 Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   於 Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()    XF2001.Android
或者
嚴重性    程式碼    說明    專案    檔案    行    隱藏項目狀態
錯誤        Failed to generate resource table for split '' "Failed to generate resource table for split ''".    DynamicFlexLayout.Android
嚴重性    程式碼    說明    專案    檔案    行    隱藏項目狀態
錯誤        "LinkAssemblies" 工作發生未預期的失敗。
System.IO.FileNotFoundException: Could not load assembly 'DynamicFlexLayout.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken='. Perhaps it doesn't exist in the Mono for Android profile?
檔案名稱: 'DynamicFlexLayout.Android.dll'
   於 Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)
   於 Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.GetAssembly(String fileName)
   於 Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)
   於 Xamarin.Android.Tasks.LinkAssemblies.Execute()
   於 Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   於 Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()    DynamicFlexLayout.Android
或者
嚴重性    程式碼    說明    專案    檔案    行    隱藏項目狀態
錯誤        Can not resolve reference: `Xamarin.Forms.Xaml`, referenced by `XF3031`. Please add a NuGet package or assembly reference for `Xamarin.Forms.Xaml`, or remove the reference to `XF3031`.    XF3031.Android            
錯誤        No resource found that matches the given name: attr 'colorPrimaryDark'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    2    
錯誤        No resource found that matches the given name: attr 'windowNoTitle'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    2    
錯誤        No resource found that matches the given name: attr 'colorPrimary'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    2    
錯誤        No resource found that matches the given name: attr 'windowActionBar'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    2    
錯誤        Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    2    
錯誤        No resource found that matches the given name: attr 'colorAccent'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    3    
錯誤        No resource found that matches the given name: attr 'colorAccent'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    4    
錯誤        No resource found that matches the given name: attr 'windowActionModeOverlay'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    4    
錯誤        Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.Dialog'.    XF3031.Android    D:\Vulcan\GitHub\XCourse19\XF3031\Solution\XF3031\XF3031.Android\Resources\values\styles.xml    4
從此錯誤訊息中可以看到 "ResolveLibraryProjectImports" 工作發生未預期的失敗,而且有個 System.IO.FileNotFoundException: Could not load assembly 這樣的例外異常;當看到這樣的錯誤訊息,最快的解決方案就是先清除所有的專案,並且關閉您的 Visual Studio 2019 專案,並且重新開啟該 Xamarin.Forms 方案,重新再建置一次,一切問題都迎刃而解了。