2010-05-20 15 views
43

En el emulador de Windows Phone 7, cuando se presiona el botón de retroceso de hardware, el comportamiento predeterminado es que cierre su aplicación actual. Quiero anular este comportamiento predeterminado para que navegue a la página anterior en mi aplicación.Cómo manejar el botón Atrás en Windows Phone 7

Después de algunas investigaciones, parece que debería ser posible hacer esto reemplazando el método OnBackKeyPress, así:

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

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

Sin embargo, al hacer clic en el botón Atrás todavía cierra mi solicitud. Poner un punto de interrupción en el método anterior revela que nunca se llama. Tengo otro punto de interrupción en el código de salida de mi aplicación, y este punto de interrupción es.

¿Hay algo más que deba hacer para interceptar el botón Atrás?

+2

Anulando el OnBackKeyPress() desde mi MainPage.xaml y llamando a e.Cancel funcionó bien para mí. – BrokeMyLegBiking

+0

que puede manejar el botón de retroceso, [marque este post respuesta de mí] [1] [1]: http://stackoverflow.com/questions/8975822/prompt-confirmation-dialog-when-exit -app/8977078 # 8977078 – Santhu

Respuesta

29

Parece que no es posible anular el método OnBackKeyPress para interceptar la tecla de retroceso a menos que utilice el método Navigate para moverse entre páginas en su aplicación.

Mi método anterior de la navegación fue cambiar la raíz visual, como:

App.Current.RootVisual = new MyPage(); 

Esto significaba que podía mantener a todos mis páginas en la memoria, así que no necesito para almacenar en caché los datos almacenados en ellos (algunos de los datos se recopilan en la red).

Ahora parece que necesito usar realmente el método Navigate en el marco de página, que crea una nueva instancia de la página a la que estoy navegando.

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

Una vez que empecé a navegar utilizando este método, entonces podría invalidar el manejo botón de retroceso en la forma descrita en mi pregunta ...

+0

De hecho, si utiliza navegar y luego anula el botón Atrás, puede implementar un nuevo comportamiento para él (¡esto lo comprobé yo mismo!). – RoguePlanetoid

+0

¿Hay * otra * otra forma de hacerlo? ¿Qué ocurre si todas las interacciones se realizan en una página? ¿Es entonces imposible anular el botón Atrás? –

+0

Sugeriría tener una página "ficticia" que navegue a su página principal cuando se inicia la aplicación, de esa manera podría anular el botón Atrás en su página principal. – Pking

3

pude utilizar esta técnica para hacer lo que quería, que es para evitar la navegación hacia atrás mientras se oculta un control que se desliza dentro y fuera de la ventana. De forma predeterminada, la visibilidad del control está contraída. Los guiones gráficos se utilizan para controlar cuándo se vuelve visible o colapsó. En XAML, dentro del 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> 

Luego, en el código de la página:

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

Nota: En el guión gráfico que esconde el ContentScroller (que es una cuadrícula), el KeyTime es establecer en "00:00:01" porque quiero que permanezca visible mientras se desliza (y se desvanece) fuera de la vista.

Nota 2: El motivo StoryboardHideControlSlider.GetCurrentState() != ClockState.Active se incluye en la instrucción if porque si el usuario presiona dos veces el botón Atrás y el Guión gráfico no se ha completado, se ejecutará nuevamente. Esto evita que el botón de retroceso cancele la navegación de vuelta a la página anterior. En otras palabras, si el Guión gráfico está activo, el código "sabe" que el usuario ya ha iniciado la ocultación y tiene la intención de volver a la página anterior. (Bueno, al menos ese es el comportamiento que van a obtener ... ¡y no verán la animación dos veces)!

23

Si no desea el comportamiento predeterminado de la tecla de retroceso, establezca Cancel = true en el parámetro CancelEventArgs en OnBackKeyPress. En mi página, he reemplazado el botón Atrás para cerrar el control de un navegador web en lugar de volver atrás.

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