2010-05-20 7 views
43

Wenn der Hardware-Zurück-Button auf dem Windows Phone 7-Emulator gedrückt wird, wird standardmäßig die aktuelle Anwendung geschlossen. Ich möchte dieses Standardverhalten überschreiben, sodass es zur vorherigen Seite in meiner Anwendung navigiert.Umgang mit der Zurück-Taste unter Windows Phone 7

Nach einigen Recherchen, es scheint, es sollte möglich sein, dies zu tun, indem Sie die OnBackKeyPress Methode überschrieben, etwa so:

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

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

jedoch nach wie vor die Zurück-Schaltfläche klicken, meine Anwendung geschlossen wird. Das Setzen eines Haltepunkts auf die obige Methode zeigt, dass es nie aufgerufen wird. Ich habe einen anderen Haltepunkt auf meinem Anwendungsbeendigungscode, und dieser Haltepunkt ist Hit.

Gibt es noch etwas anderes, was ich tun muss, um den Zurück-Knopf abzufangen?

+2

Das Überschreiben der OnBackKeyPress() von meiner MainPage.xaml und Aufruf von e.Cancel funktionierte gut für mich. – BrokeMyLegBiking

+0

Sie die Zurück-Taste umgehen kann, [lesen Sie in diesem Beitrag Antwort von mir] [1] [1]: http://stackoverflow.com/questions/8975822/prompt-confirmation-dialog-when-exit -app/8977078 # 8977078 – Santhu

Antwort

29

Es scheint, dass es nicht möglich ist, die OnBackKeyPress-Methode zum Abfangen des Zurück-Schlüssels außer Kraft zu setzen, wenn Sie die Navigate-Methode verwenden, um zwischen Seiten in Ihrer Anwendung zu wechseln.

Meine bisherige Methode der Navigation war die Wurzel visuelle ändern zu können, wie:

App.Current.RootVisual = new MyPage(); 

Dies bedeutete, dass ich alle meine Seiten im Speicher halten konnte, so dass ich nicht die Daten auf ihnen gespeichert zwischenzuspeichern müssen (einige der Daten werden über das Netz gesammelt).

Jetzt scheint es, ich brauche tatsächlich die Navigate-Methode für den Seitenrahmen, der eine neue Instanz der Seite erstellt, die ich navigiere.

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

Sobald ich begann, mit dieser Methode der Navigation, konnte ich dann die Zurück-Button Handhabung in der Art und Weise meiner Frage ...

+0

In der Tat, wenn Sie navigieren, dann überschreiben Sie die Zurück-Taste, dann können Sie ein neues Verhalten für sie implementieren (dies selbst überprüft!). – RoguePlanetoid

+0

Gibt es * irgendeinen * anderen Weg es zu tun? Was wäre, wenn alle Interaktionen auf einer Seite durchgeführt werden? Ist es dann unmöglich, die Zurück-Taste zu übersteuern? –

+0

Ich würde vorschlagen, eine "Dummy" -Seite zu haben, die zu Ihrer Hauptseite navigiert, wenn die Anwendung startet, auf diese Weise könnten Sie die Zurück-Schaltfläche auf Ihrer Hauptseite überschreiben. – Pking

3

beschrieben außer Kraft setzen konnte ich diese Technik verwenden, um zu tun, was ich wollte, Dies soll die Zurück-Navigation verhindern, während ein Steuerelement versteckt wird, das in das Fenster hinein- und herausgleitet. Standardmäßig ist die Sichtbarkeit des Steuerelements reduziert. Storyboards steuern, wann es sichtbar oder kollabiert wird. In XAML, innerhalb der Storyboard:

<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> 

dann in der Code-Seite:

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; 
    } 
} 

Anmerkung: In der Storyboard, das den ContentScroller verbirgt (das ein Gitter ist), ist die KeyTime Stellen Sie "00:00:01" ein, weil ich möchte, dass es sichtbar bleibt, während es gleitet (und ausgeblendet wird).

Hinweis 2: Der Grund StoryboardHideControlSlider.GetCurrentState() != ClockState.Active ist in der if-Anweisung enthalten, denn wenn der Benutzer zweimal auf die Zurück-Schaltfläche klickt und das Storyboard nicht abgeschlossen wurde, wird es erneut ausgeführt. Dies verhindert, dass die Zurück-Taste die Navigation zur vorherigen Seite zurücknimmt. Mit anderen Worten, wenn das Storyboard aktiv ist, "weiß" der Code, dass der Benutzer ihn bereits ausgeblendet hat und beabsichtigt, zur vorherigen Seite zurückzukehren. (Nun, zumindest wird das Verhalten, das sie bekommen werden ... und sie werden die Animation nicht zweimal sehen)!

23

Wenn Sie das standardmäßige Zurück-Tastenverhalten nicht möchten, setzen Sie Cancel = true im CancelEventArgs-Parameter in OnBackKeyPress. Auf meiner Seite habe ich die Zurück-Schaltfläche außer Kraft gesetzt, um ein Webbrowser-Steuerelement zu schließen, anstatt zurück zu navigieren.