2012-08-31 12 views
6

Cuando se navega una página en Silverlight puede anular este método.Cómo detectar el botón de retroceso o el botón de navegación hacia adelante en una aplicación de navegación Silverlight

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 
} 

El NavigationEventArgs tiene una enumeración NavigationMode que se define como

public enum NavigationMode 
{ 
    New = 0, 
    Back = 1, 
    Forward = 2, 
    Refresh = 3, 
} 

Pero llamar e.NavigationMode siempre lanza una NotImplementedException

¿Hay una manera de Silverlight para detectar una página está siendo navegado a causa el usuario presiona el botón de navegación hacia adelante o hacia atrás.

Lo que estoy tratando de lograr es algún tipo de estado que se puede conservar cuando el usuario presiona el botón Atrás.

Por ejemplo, supongamos que tiene una página de cliente que muestra una lista de clientes en una cuadrícula de datos. El usuario puede seleccionar un cliente y hay una vista detallada que muestra todos los pedidos para ese cliente. Ahora dentro de un artículo de pedido puede hacer clic en un enlace de hipervínculo que lo lleva al historial de envío del pedido que es una página separada. Cuando el usuario pulsa el botón Atrás, quiero volver a la página de clientes y seleccionar automáticamente el cliente que estaba viendo. ¿Es esto posible?

También probé a cabo la función de navegación fragmento

NavigationService.Navigate(new Uri("#currentcustomerid=" 
     + customer.Id.ToString(), UriKind.Relative)); 

cuando cambia la selección del cliente, pero esto añade demasiados elementos a la historia cuando el usuario hace clic en varios clientes en la página del cliente.

EDITAR

También hay un método que se puede anular

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
{ 
} 

que es el mismo que controla el evento NavigationService.Navigating como se indica por la respuesta de BugFinder. En este método e.NavigationMode siempre devuelve New cuando presione el botón Atrás o Adelante. La única vez que este método devuelve Back es cuando se llama explícitamente NavigationService.GoBack()

Respuesta

1

la

public enum NavigationMode 
{ 
    New = 0, 
    Back = 1, 
    Forward = 2, 
    Refresh = 3, 
} 

se aplica al caso .. Navegando

si hago

_ns.Navigating += ns_Navigating; 
     void ns_Navigating(object sender, NavigatingCancelEventArgs e) 
     { 

      if (SecurityCheck(e.Uri.OriginalString)) return; 
      e.Cancel = true; 
      ShowError("You are not authorised to view this page"); 
     } 

puedo ver que hay que e.NavigationMode está configurado. Podrías hacer tu prueba allí?

+0

Incluso cuando presiona el botón Atrás o Adelante. ** NavigationMode ** siempre es 'NavigationMode.New' en este método. –

1

No creo que hay alguna manera fácil de hacerlo fuera de la caja, por lo que yo sé.

Lo que estamos tratando de lograr que se puede hacer fácilmente utilizando un marco creé en http://ultimateframework.codeplex.com

Lo que he hecho es para engranar la navegación marco de navegación de Silverlight y el prisma juntos, por lo que tendrá la unidad y el prisma y mvvm amigable.

Lo que se quiere lograr que se puede hacer utilizando el marco de las siguientes maneras

1) Implementar IsNavigationTarget y devuelve true -> lo que mantendrá la misma instancia cuando se navega hacia atrás, por lo tanto, mantener la selección/seleccionaron ít.

2) Acceder a la revista de la OnNavigatedTo para realizar un seguimiento de dónde viene, digamos/artículo/1 fue la pila anterior, para que sepa botón de retroceso ha sido presionado en la partida 1.

3) Usted puede incluso poner en práctica su propio back/forward/refresh dentro del control personalizado proporcionado para lograr el mismo resultado (no en codeplex todavía)

Realmente lo uso para el código de producción en el trabajo, y lo creé, así que siéntase libre de probarlo. Tenga en cuenta que la versión de allí es defectuosa, y todavía no he tenido tiempo de lanzar nuestra última compilación, pero si la necesita, la actualizaré :), solo piérdame.

1

Establezca una variable en el control de usuario que contenga el cuadro de contenido que indica qué cliente está activo.

Agregue un controlador para el evento Navegado de contenido en el control de usuario. Use esto para verificar la variable que indica qué cliente está activo (si la variable no es nula), y para seleccionar el cliente.

+0

Creo que te perdiste el sentido de la pregunta. El hecho es que cuando navego por la página no puedo determinar si es por navegación hacia atrás o navegación nueva. ¿Cómo se almacenará la ayuda estatal? –

+0

Porque puede decir de dónde vienen. Si navegan de la segunda página a la primera a través de otros medios que no sean el botón Atrás, entonces el cliente se mostraría bien independientemente, pero quizás eso no sería indeseable de todos modos. – NeutralHandle

Cuestiones relacionadas