我正在使用密碼保護的Windows Phone 8應用程序。每次該應用程序被激活或激活時,顯示密碼屏幕的最佳方式是什麼?每次啓動/啓動應用程序時顯示密碼屏幕的最佳方式
我認爲使用Launch和Activation事件處理程序的中心點應該是App.xaml.cs。但是,我怎樣才能顯示密碼屏幕?
問題是,人們永遠不知道應用程序啓動或重新激活時將顯示哪些頁面。它是主頁面或任何其他頁面,當應用程序被停用時最後顯示的頁面。
我試圖導航攔截到第一頁,取消,並出示密碼頁面,而不是:
// App.xaml.cs
private void InitializePhoneApplication() {
...
RootFrame.Navigating += HandleFirstNavigation;
...
}
private void HandleFirstNavigation(object sender, NavigatingCancelEventArgs e) {
RootFrame.Navigating -= HandleFirstNavigation;
e.Cancel = true;
RootFrame.Dispatcher.BeginInvoke(new Action(this.OpenPasscodePage));
}
private void OpenPasscodePage() {
RootFrame.Navigate(PasscodePageUri);
}
這工作,但只有當應用程序lauchend。當應用程序重新啓動(休眠或墓碑)時,e.Cancel將被註冊。雖然調用密碼頁面的導航被稱爲原始頁面顯示。
移動導航密碼頁面從導航到導航中不值得或者:
private void InitializePhoneApplication() {
...
RootFrame.Navigated += PasscodePageAfterFirstNavigation;
...
}
private void PasscodePageAfterFirstNavigation(object sender, EventArgs e) {
RootFrame.Navigated-= PasscodePageAfterFirstNavigation;
RootFrame.Navigate(PasscodePageUri);
}
這似乎是某種形式的競爭狀態:有時密碼頁面顯示,有時原來的頁面。即使密碼頁面出現,這看起來也很糟糕,因爲在應用程序導航到密碼頁面之前,首先會看到原始頁面的一小部分時間。
這兩種解決方案都不起作用。任何想法什麼是正確的方式來實現這一點?
編輯:同時,我嘗試了第三個解決方案也不起作用。該解決方案採用開放的映射:
App.xaml.cs
public bool PasscodeWasConfirmed; private void Application_Launching(object sender, LaunchingEventArgs e) {
...
PasscodeWasConfirmed = false;
...
}
private void Application_Activated(object sender, ActivatedEventArgs e) {
...
PasscodeWasConfirmed = false;
...
}
public Uri InitialPageUri;
public bool ShouldRedirectToPasscodePage(Uri uri) {
if (PasswordWasConfirmend == false) {
InitialPageUri = uri;
return true;
}
return false;
}
UriMapper
public class AppUriMapper : UriMapperBase {
public override Uri MapUri(Uri uri) {
App app = (Application.Current as App);
if (app != null) {
if (app.ShouldRedirectToPasscodePage(uri))
return PasscodeQueryPage.PageUri;
}
// default
return uri;
}
}
PasscodePage
public partial class PasscodePage : PhoneApplicationPage {
...
private void PasscodeConfirmed() {
App app = (Application.Current as App);
app.PasscodeWasConfirmed = true;
NavigationService.Navigate(app.InitialPageUri);
}
}
邏輯運行沒有任何問題,但在確認密碼後,該應用程序不會導航到InitialPageUri。 Uri映射器被調用並正確返回InitialPageUri(不再重定向)。但沒有導航發生...
沒有錯誤,異常或調試輸出。根本不算什麼happes ...
最大的問題用開放的Mapper時: 當應用程序從休眠狀態激活沒有導航它可以映射或重定向...
我不認爲這應該是如何工作的。我的例子有什麼不同? CompleteInitializePhoneApplication和CheckForResetNavigation都是RootFrame.Navigated的處理程序。與我的例子中使用的PasscodePageAfterFirstNavigation的區別在哪裏? –
我已經寫了一個特殊的例子使用這個上面,它的工作原理 - 應用程序激活後,我看到的第一件事就是每次傳遞頁面。我必須承認,我沒有時間分析你的代碼(我會盡量在晚上做) - 我剛剛編寫了適合我的代碼。你試過了嗎? – Romasz
是的,我試過你的代碼(已經在我的第一個評論之前),它不起作用。請注意,該問題不是應用程序啓動,而是應用程序重新激活。當從休眠狀態重新激活時,沒有可以重定向的導航,因此您的代碼無法工作。當從墓碑狀態重新激活時,應用會自動導航到最後一個活動頁面。看起來這種重新激活導航的工作方式與啓動時的導航有所不同。在這種情況下,有我的帖子中描述的racecondition:Somtimes應用程序導航到PasscodePage,有時它不... –