2013-11-01 40 views
0

我正在使用密碼保護的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時: 當應用程序從休眠狀態激活沒有導航它可以映射或重定向...

回答

1

(我已經編輯以前的答案,而不是添加一個新的)
我花了一點時間試圖找到一個解決方案,我不明白爲什麼你的代碼不運行。 就我而言,如果我在App中做了這樣的改變就足夠了。XAML:

private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) 
    { 
    // Set the root visual to allow the application to render 
    if (RootVisual != RootFrame) 
     RootVisual = RootFrame; 

    // Remove this handler since it is no longer needed 
    RootFrame.Navigated -= CompleteInitializePhoneApplication; 
    App.RootFrame.Navigate(new Uri("/passPage.xaml", UriKind.RelativeOrAbsolute)); 
    } 

這個工作對我的例子是鏈接下http://sdrv.ms/1ajH40E
但是 - 我不能阻止用戶看到時,他阻礙了布頓最後一個屏幕,並艇員選拔到應用的回報,然後眨眼他可以在離開應用程序之前看到最後一頁。
我不知道是否有可能點擊MS按鈕後更改此行爲:
windows phone change deactivated app image

第二個編輯
好吧 - 也許我已經找到了解決方案,爲什麼它在你的代碼sometiems工作,有時不。按下開始或搜索按鈕後,應用程序可以轉到兩種情況:墓碑和非墓碑。返回不同的事件發生後。上面的代碼適用於墓碑案件,但不適用於非墓碑案件。要使用你需要添加(因爲頁面不被再次初始化)第二工作吧 - (當然也可以是不同的解決方案):

bool afterActivation = false; 
    private void Application_Activated(object sender, ActivatedEventArgs e) 
    { 
    afterActivation = true; 
    } 
    private void CheckForResetNavigation(object sender, NavigationEventArgs e) 
    { 
    // If the app has received a 'reset' navigation, then we need to check 
    // on the next navigation to see if the page stack should be reset 
    if (e.NavigationMode == NavigationMode.Reset) 
     RootFrame.Navigated += ClearBackStackAfterReset; 

    if (afterActivation) 
    { 
     afterActivation = false; 
     App.RootFrame.Navigate(new Uri("/passPage.xaml", UriKind.RelativeOrAbsolute)); 
    } 
    } 

還請確保您的調試屬性在VS:項目 - > 「屬性」 - >「調試」 - >「停用」後的「墓碑」複選框。
你也可以在這裏找到一些資料(如果你以前沒有見過吧):
http://blogs.msdn.com/b/ptorr/archive/2010/12/11/how-to-correctly-handle-application-deactivation-and-reactivation.aspx

+0

我不認爲這應該是如何工作的。我的例子有什麼不同? CompleteInitializePhoneApplication和CheckForResetNavigation都是RootFrame.Navigated的處理程序。與我的例子中使用的PasscodePageAfterFirstNavigation的區別在哪裏? –

+0

我已經寫了一個特殊的例子使用這個上面,它的工作原理 - 應用程序激活後,我看到的第一件事就是每次傳遞頁面。我必須承認,我沒有時間分析你的代碼(我會盡量在晚上做) - 我剛剛編寫了適合我的代碼。你試過了嗎? – Romasz

+0

是的,我試過你的代碼(已經在我的第一個評論之前),它不起作用。請注意,該問題不是應用程序啓動,而是應用程序重新激活。當從休眠狀態重新激活時,沒有可以重定向的導航,因此您的代碼無法工作。當從墓碑狀態重新激活時,應用會自動導航到最後一個活動頁面。看起來這種重新激活導航的工作方式與啓動時的導航有所不同。在這種情況下,有我的帖子中描述的racecondition:Somtimes應用程序導航到PasscodePage,有時它不... –

相關問題