2011-05-08 7 views
7

En cada vistaPrisma RequestNavigate no funciona

public partial class View2 : UserControl, IRegionMemberLifetime, INavigationAware 
{ 

    public bool KeepAlive 
    { 
    get { return false; } 
    } 

    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) 
    { 
    return true; 
    } 
    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext) 
    { 
    // Intentionally not implemented. 
    } 
    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext) 
    { 
    this.navigationJournal = navigationContext.NavigationService.Journal; 
    } 

} 

Inicializar:

container.RegisterType<object, View1>("View1"); 
container.RegisterType<object, View2>("View2"); 

regionManager.RequestNavigate("Window1", new Uri("View1", UriKind.Relative)); 
regionManager.RequestNavigate("Window2", new Uri("View2", UriKind.Relative)); 

estoy siguiendo la guía para desarrolladores, que no cambia la vista si existe vista.

+0

¿No debería registrar sus tipos contra las interfaces base en lugar de contra el tipo 'object'? –

+2

en la guía del desarrollador, escribe de esta manera, no sé qué interfaz base, ¿te refieres a IModule? – viewer20q

+0

¿A qué guía de desarrollador se está refiriendo? –

Respuesta

9

¿Estás seguro de que la vista se llena con el contenedor?

Yo te sugeriría para proporcionar una devolución de llamada para el método RequestNavigate, por lo que será capaz de realizar un seguimiento de lo que sucede con su punto de vista a través de la NavigationResult:

regionManager.RequestNavigate 
(
    "Window1", 
    new Uri("View2", UriKind.Relative), 
    (NavigationResult nr) => 
    { 
     var error = nr.Error; 
     var result = nr.Result; 
     // put a breakpoint here and checkout what NavigationResult contains 
    } 
); 
+1

Después de 7 años, y estoy pensando votaremos esta respuesta. Fue simple y me ayudó a abordar el problema fácilmente, luego me figuro que fui yo quien lo respondió ... – Shimmy

2

he visto que si implemento y IConfirmNavigateRequest no llame a continutationCallback (true), la navegación falla silenciosamente.

public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback) 
    { 
     //***Should have actual logic here 
     continuationCallback(true); 
    } 

Si bien este puede no ser tu caso, me di cuenta de esto depurando el código de Prism. Sugeriría que hagas esto para resolver tu problema. Elimine las referencias a lo siguiente en cada proyecto relevante.

  • Microsoft.Practices.Prism
  • Microsoft.Practices.Prism.Interactivity
  • Microsoft.Practices.Prism.MefExtensions
  • Microsoft.Practices.Prism.UnityExtensions

Luego se agrega el proyectos de PrismLibrary DeskTop, Silverlight o directorio telefónico (donde instaló PRISM). Luego haz referencia a estos proyectos.

+0

¡Gracias! Ese fue exactamente mi problema, que justed desperdiciaba una hora. – Golvellius

1

Esta es su problema:

bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) => true; 

Si desea una nueva vista que se crea y se añade a su región cada vez que llame RequestNavigate(), IsNavigationTarget() debe devolver false en lugar de la verdadera.