在 Xamarin.Forms / .NET Standard 體驗之旅 3的文章中,我們將要來測試這個最常用的 NuGet 套件:PCLStorage。
我們從這個套件在 NuGet 官網上的內容可以看的出來,這個 NuGet 套件本身是支援 PCL 可攜式類別庫的,那麼,這樣的 PCL 套件,是否可以能夠在 .NET Standard 標準類別庫,並且提供給 Xamarin.Android / Xamarin.iOS / UWP 平台系統來使用,我們來測試看看。
測試範例專案原始碼
這篇文章中的測試範例專案原始碼,您可以從這裡取得 https://github.com/vulcanlee/xamarin-forms-develop-notes-example/tree/master/NETStdPCLStorage
開始建立專案
請點選功能表 [檔案] > [新增] > [專案],此時,您會看到底下的 [新增專案] 對話視窗。
我們點選 Prism Template Pack 提供的 Xamarin.Forms 專用的專案樣板,請點選 [已安裝] > [Visual C#] > [Prism] > [Prism Blank App (Xamarin.Forms)]。
接著在名稱欄位輸入該專案名稱後,點選 [確定] 按鈕,以建立此練習專案。
然後,在 [PRISM PROJEC WIZAD] 對話窗中,選擇您要跨平台的作業系統,容器 (Container) 這裡,我個人喜歡與習慣使用 Prism,您可以選擇您自己要用的容器,最後,點選 [CREATE PROJECT] 按鈕。
安裝 PCLStorage NuGet 套件
在這裡,請使用滑鼠右建,點選剛剛建立好的方案節點,選擇 [管理方案的 NuGet 套件] 項目。
在 [瀏覽] 標籤頁次上,輸入
PCLStorage
這個關鍵字,搜尋出這個套件。這個 PCLStorage 套件圖示為一個綠色瓶子樣子。
從下圖中,PCLStorage 套件本身僅支援 PCL Profile259,並且不支援 .NET Standard 標準類別庫,不過,沒有關係,我們嘗試繼續安裝下去,因此,在右方區域,勾選 [NETStdPCLStorage] 這個 .NET Standard 專案(您可以不用勾選原生專案)
當我們點選 [安裝] 按鈕之後,會看到 Visual Studio 會提示您這樣會安裝那些相依性的套件。
修正 View / ViewModel 開始使用 Acr.UserDialogs
安裝好套件之後,讓我們打開 MainPage.xaml 檔案,修改XAML內容。
這裡,我們僅在 StackLayout 版片配置內,加入3個按鈕項目,並且設定 Command 屬性,要綁定 ViewModel 內類型為 DelegateCommand 的特定物件,這三個按鈕分別會將文字輸入盒輸入的文字進行儲存到指定檔案中、清空文字輸入盒、從檔案中將內容讀取出來,並且置換掉文字輸入盒的內容。
透過這三個按鈕,我們可以確認資料是否真的有擁有儲存在手機檔案中,當然,您也可以於儲存到檔案中之後,關閉這個程式,接著重新啟動,看看是否可以從檔案中讀取出來。
<?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="NETStdPCLStorage.Views.MainPage"
Title="{Binding Title}">
<StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand">
<Label Text="Welcome to Xamarin Forms and Prism!" />
<Entry Text="{Binding MyEntry}"/>
<Button Text="Save" Command="{Binding SaveCommand}"/>
<Button Text="Clean" Command="{Binding CleanCommand}"/>
<Button Text="Load" Command="{Binding LoadCommand}"/>
</StackLayout>
</ContentPage>
接著我們打開
MainPageViewModel.cs
檔案,修正 ViewModel 的商業邏輯程式碼。
這裡進行檔案文字內容的讀取與寫入的程式碼,全部都是從 PCLStorage 官方網站上複製下來的,我們在此就不再多做說明。
namespace NETStdPCLStorage.ViewModels
{
public class MainPageViewModel : ViewModelBase
{
#region MyEntry
private string _MyEntry = "";
/// <summary>
/// MyEntry
/// </summary>
public string MyEntry
{
get { return this._MyEntry; }
set { this.SetProperty(ref this._MyEntry, value); }
}
#endregion
public DelegateCommand SaveCommand { get; set; }
public DelegateCommand CleanCommand { get; set; }
public DelegateCommand LoadCommand { get; set; }
public MainPageViewModel(INavigationService navigationService)
: base(navigationService)
{
Title = "Main Page";
SaveCommand = new DelegateCommand(async () =>
{
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder folder = await rootFolder.CreateFolderAsync("MySubFolder",
CreationCollisionOption.OpenIfExists);
IFile file = await folder.CreateFileAsync("answer.txt",
CreationCollisionOption.ReplaceExisting);
await file.WriteAllTextAsync(MyEntry);
});
CleanCommand = new DelegateCommand(() =>
{
MyEntry = "";
});
LoadCommand = new DelegateCommand(async () =>
{
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder folder = await rootFolder.CreateFolderAsync("MySubFolder",
CreationCollisionOption.OpenIfExists);
IFile file = await folder.GetFileAsync("answer.txt");
MyEntry = await file.ReadAllTextAsync();
});
}
}
}
修正 Android 專案,進行 UserDialogs 的初始化
在這個文件中,並沒有提到需要在原生平台做任何初始化的工作,因此,我們也就不任何原生專案的修正。
進行測試
最後,設定預設起始專案為 Android 專案,並且選擇適當的模擬器或者實體手機,開始進行測試。