問題
當在一個子頁面是從父頁面導航過來的,不過,往往會有機會遇到這樣的情況,當從子頁面返回到父頁面的時候,需要把子頁面的一些狀態或者物件,傳回到父頁面中;所以,當回到父頁面的時候,就可以更新到最新的狀態。
NavigateAsync
方法內,可以接受 NavigationParameters
物件,這個物件的型別為 Dictionary<string, object>
,因此,您可以透過 NavigationParameters
物件傳遞很多的物件到新(子)頁面內。NavigateAsync
的方法簽章 Method Signature //
// 摘要:
// Initiates navigation to the target specified by the name.
//
// 參數:
// name:
// The name of the target to navigate to.
//
// parameters:
// The navigation parameters
//
// useModalNavigation:
// If true uses PopModalAsync, if false uses PopAsync
//
// animated:
// If true the transition is animated, if false there is no animation on transition.
Task NavigateAsync(string name, NavigationParameters parameters = null, bool? useModalNavigation = default(bool?), bool animated = true);
Application.Current
取得正在執行的 Application 類別物件。Properties
屬性,這個屬性的型別是 IDictionary<string, object>
,因此,您可以將任何型態的物件值儲存到 Application.Current.Properties
這個實例中。一旦,您將系統內的某個物件加入到 Application.Current.Properties
這個實例內,系統會自動將其儲存到行動裝置內的永久儲存體內。Properties
這個字典型別,僅僅能夠序列化基本類型(Primitive Type)的物件,所以,不太建議使用 Properties
來儲存太複雜的物件內容。 protected override void OnAppearing()
{
base.OnAppearing();
}
OnNavigatedFrom
/ OnNavigatedTo
,如此, public void OnNavigatedFrom(NavigationParameters parameters)
{
}
public void OnNavigatedTo(NavigationParameters parameters)
{
Init();
}
遠端登入
功能,並且設定相關帳號可以使用遠端登入功能;若還是不行,請確認 Mac 電腦上沒有做 SSH ( 22 Port)的阻擋。您可以在 Windows 作業系統上,使用類似 Putty 這裡終端機連線工具,設定使用 SSH 方式連線到 Mac 電腦來進行測試。命令提示字元
視窗powershell
並且按下 Enter
,進入到 powershellSet-VMProcessor -VMName "你的虛擬機器名稱" -ExposeVirtualizationExtensions $true
PCLStorage
/ Xam.Plugin.Media
NuGet 套件。CrossMedia.Current.TakePhotoAsync
來啟動手機中的照相機,一旦完成照相作業,就可以取得這個照片的檔案路徑。HttpClient
物件,當然,在 PCL 專案內您會找不到這個類別,請您要安裝 Microsoft.Net.Http
這個 NuGet 套件即可使用。 public MainPageViewModel(IPageDialogService dialogService)
{
_dialogService = dialogService;
拍照Command = new DelegateCommand(async () =>
{
// 進行 Plugin.Media 套件的初始化動作
await CrossMedia.Current.Initialize();
// 確認這個裝置是否具有拍照的功能
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
await _dialogService.DisplayAlertAsync("No Camera", ":( No camera available.", "OK");
return;
}
// 啟動拍照功能,並且儲存到指定的路徑與檔案中
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
Directory = "Sample",
Name = "Sample.jpg"
});
if (file == null)
return;
// 讀取剛剛拍照的檔案內容,轉換成為 ImageSource,如此,就可以顯示到螢幕上了
MyImageSource = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
#region 將剛剛拍照的檔案,上傳到網路伺服器上
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
// 取得這個圖片檔案的完整路徑
var path = file.Path;
// 取得這個檔案的最終檔案名稱
var filename = Path.GetFileName(path);
// 開啟這個圖片檔案,並且讀取其內容
using (var fs = file.GetStream())
{
var streamContent = new StreamContent(fs);
streamContent.Headers.Add("Content-Type", "application/octet-stream");
streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + Path.GetFileName(path) + "\"");
content.Add(streamContent, "file", filename);
// 上傳到遠端伺服器上
HttpResponseMessage message = await client.PostAsync("http://
YourHost/api/UploadImage", content);
var input = message.Content.ReadAsStringAsync();
// 更新頁面上的 Image 控制項,顯示出剛剛上傳的圖片內容
RemoteImageURL = $"http://YourHost/uploads/{filename}";
}
}
}
#endregion
});
}
登出
功能選項,接著,應用程式就會跳到 登入
頁面上,此時,這個頁面就會成為這個應用程式的首頁,因為導航堆疊已經被清空了,所以,當按下實體按鍵的回上一頁按鈕,此時,應用程式也就回到背景模式,手機桌面也就出現了。 public YourConstructor(INavigationService navigationService)
{
_navigationService = navigationService;
登出Command = new DelegateCommand(() =>
{
await _navigationService.NavigateAsync("xf:///MDPage/NaviPage/LoginPage");
});
}|
登入
頁面的時候 (LoginPage),請使用絕對路徑的 URI 來表示,而不要使用相對路徑,例如:await _navigationService.NavigateAsync("LoginPage");
,如此,當切換到 登入
頁面之後,應用程式的導航堆疊也就清空了。