2010-05-20 112 views
43

在windows phone 7仿真器上,當按下硬件後退按鈕時,默認行爲是讓它關閉當前應用程序。我想重寫此默認行爲,以便它導航到我的應用程序中的上一頁。如何處理Windows Phone 7上的後退按鈕

經過一番研究,現在看來,這應該是可以通過重寫OnBackKeyPress方法,像這樣做:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 
    // do some stuff ... 

    // cancel the navigation 
    e.Cancel = true; 
} 

但是,單擊後退按鈕仍然關閉我的申請。在上述方法上放置一個斷點表明它永遠不會被調用。我在我的應用程序退出代碼上有另一個斷點,並且此斷點命中。

我還需要做些什麼來攔截後退按鈕?

+2

從我的MainPage.xaml重寫OnBackKeyPress()並調用e.Cancel對我來說工作得很好。 – BrokeMyLegBiking 2010-12-20 04:13:30

+0

可以處理後退按鈕,[查看我的這個帖子答案] [1] [1]:http://stackoverflow.com/questions/8975822/prompt-confirmation-dialog-when-exit -app/8977078#8977078 – Santhu 2012-01-27 10:46:03

回答

29

似乎無法重寫OnBackKeyPress方法來攔截後退鍵,除非您使用Navigate方法在應用程序中的頁面之間移動。

我以前的導航的方法是改變根視覺,如:

App.Current.RootVisual = new MyPage(); 

這意味着我可以把我的內存中的所有頁面,所以我並不需要緩存上存儲的數據(一些的數據是通過網絡收集的)。

現在看來我需要在頁面框架上實際使用Navigate方法,這會創建一個我正在導航的頁面的新實例。

(App.Current.RootVisual as PhoneApplicationFrame).Navigate(
            new Uri("/MyPage.xaml", UriKind.Relative)); 

一旦我開始使用這種方法,我可以再覆蓋在我的問題描述的方式返回按鈕操作導航...

+0

事實上,如果您使用導航,然後覆蓋後退按鈕,那麼您可以實現一個新的行爲(自己檢查!)。 – RoguePlanetoid 2010-05-20 18:34:56

+0

有沒有*任何其他方式來做到這一點?如果所有的交互都在一個頁面上完成呢?那麼是否無法覆蓋後退按鈕? – 2010-12-13 13:35:52

+0

我建議在應用程序啓動時導航到您的主頁面的「dummy」頁面,這樣您可以覆蓋主頁面中的後退按鈕。 – Pking 2013-02-14 11:23:18

3

我能夠使用這種技術做我想要的東西,這是爲了防止後退導航,同時隱藏了滑入和滑出窗口的控件。默認情況下,控件的可見性已摺疊。故事板用於控制何時可見或摺疊。在XAML中,故事板裏:

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ControlScroller" Storyboard.TargetProperty="(UIElement.Visibility)"> 
<ObjectAnimationUsingKeyFrames.KeyFrames> 
    <DiscreteObjectKeyFrame KeyTime="00:00:00"> 
     <DiscreteObjectKeyFrame.Value> 
      <Visibility>Visible</Visibility> 
     </DiscreteObjectKeyFrame.Value> 
    </DiscreteObjectKeyFrame> 
</ObjectAnimationUsingKeyFrames.KeyFrames> 

然後在頁面的代碼:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 

    if(ControlScroller.Visibility == Visibility.Visible && StoryboardHideControlSlider.GetCurrentState() != ClockState.Active) 
    { 
     StoryboardHideControlSlider.Begin(); 

     ContentGrid.IsHitTestVisible = true; 

     e.Cancel = true; 
    } 
} 

注:在故事板隱藏的ContentScroller(這是一個網格),該KeyTime是設置爲「00:00:01」,因爲我希望它在滑動(和淡入淡出)時保持可見狀態。

注2:if語句中包含StoryboardHideControlSlider.GetCurrentState() != ClockState.Active的原因是因爲如果用戶點擊後退按鈕兩次,故事板未完成,它將再次運行。這可以防止後退按鈕取消導航回到上一頁。換句話說,如果Storyboard處於活動狀態,則代碼「知道」用戶已經發起隱藏它並打算回到上一頁。 (好吧,至少這是他們將要得到的行爲......而且他們不會看到動畫兩次)!

23

如果您不想使用默認的後退鍵行爲,請在OnBackKeyPress的CancelEventArgs參數中設置Cancel = true。在我的頁面中,我重寫了後退按鈕來關閉Web瀏覽器控件,而不是返回。

protected override void OnBackKeyPress(CancelEventArgs e) 
    { 
     if (Browser.Visibility == Visibility.Visible) 
     { 
      Browser.Visibility = Visibility.Collapsed; 
      e.Cancel = true; 
     } 
    }