.net - services - page wpf c#
¿Cuándo se inicializa NavigationService? (2)
@Espo tu enlace me ayudó a encontrar la solución. Lo llamo una solución porque es feo , pero es lo que los propios MS hacen en su documentación:
public MyPage() // ctor
{
InitializeComponent();
this.Loaded += delegate { NavigationService.Navigating += MyNavHandler; };
this.Unloaded += delegate { NavigationService.Navigating -= MyNavHandler; };
}
Entonces, básicamente, debe darse de baja de los eventos del servicio de navegación cuando su página esté descargada.
+1 a su respuesta por ayudarme a encontrarlo. No parece poder marcar mi propia respuesta como la "respuesta aceptada", así que supongo que la dejaré por el momento.
Quiero ver el evento NavigationService.Navigating desde mi página, para evitar que el usuario navegue hacia adelante. Tengo un controlador de eventos definido así:
void PreventForwardNavigation(object sender, NavigatingCancelEventArgs e)
{
if (e.NavigationMode == NavigationMode.Forward)
{
e.Cancel = true;
}
}
... y eso funciona bien Sin embargo, no estoy seguro de dónde colocar este código:
NavigationService.Navigating += PreventForwardNavigation;
Si lo coloco en el constructor de la página o en el controlador de eventos Inicializado, entonces NavigationService sigue siendo nulo y obtengo una NullReferenceException. Sin embargo, si lo coloco en el controlador de eventos Loaded para la página, se invoca cada vez que se navega a la página. Si entiendo bien, eso significa que estoy manejando el mismo evento varias veces.
¿Puedo agregar el mismo controlador al evento varias veces (como sucedería si utilizo el evento Loaded de la página para conectarlo)? Si no, ¿hay algún lugar entre Inicializado y Cargado donde pueda hacer este cableado?
NavigationService.Navigate
desencadena tanto un evento NavigationService.Navigating
AND como un evento Application.Navigating
. Resolví este problema con lo siguiente:
public class PageBase : Page
{
static PageBase()
{
Application.Current.Navigating += NavigationService_Navigating;
}
protected static void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
{
// put your event handler code here...
}
}