2012-02-22 17 views
6

In diversi esempi online ho trovato questo:OnNavigatedTo vs evento Load

public partial class ForecastPage : PhoneApplicationPage 
{ 
    Forecast forecast; 

    public ForecastPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     // code here 
    } 
} 

ma in altri ho trovato l'utilizzo della manifestazione Load come

public partial class Person : PhoneApplicationPage 
{ 
    private PersonViewModel _ViewModel; 

    public Person() 
    { 
    InitializeComponent(); 
    this.Loaded += new RoutedEventHandler(SearchView_Loaded); 
    } 

    void SearchView_Loaded(object sender, RoutedEventArgs e) 
    { 
    // code here 
    } 
} 

So che OnNavigatedTo incendi prima dell'evento Load , ma entrambi sparano prima che l'interfaccia utente venga inserita nel telefono, quindi la mia domanda è C'è qualche vantaggio in uso un metodo dall'altro?

+1

Se si sta eseguendo molta inizializzazione, sarà necessario utilizzare Carichi anziché OnNavigatedTo altrimenti la pagina potrebbe impiegare un po 'di tempo per essere caricata. – brendan

risposta

7

Lettura da documentazione su OnNavigatedTo:

Chiamato quando una pagina diventa la pagina attiva in un frame.

e quando leggiamo di Loaded evento vedi:

si verifica quando un FrameworkElement è stato costruito e ha aggiunto alla struttura ad albero oggetto.

sono completamente diversi, come la pagina, mi corregga se sbaglio, può diventare più active poi una volta durante la vita della vostra applicazione, ma constuction della FrameworkElementsolito accade una volta.

+0

Alcuni esempi di MSFT (ad esempio http://msdn.microsoft.com/library/windows/apps/ff967547(v=vs.105).aspx) inseriscono il loro codice in OnNavigatedTo e utilizzano un bool nel costruttore di pagine per determinare se deve essere eseguito. – Jedidja

23

Non sarei d'accordo con Tigran.

public View() 
{ 
    InitializeComponent(); 

    personList.ItemsSource = PersonDataSource.CreateList(100); 

    Loaded += (sender, args) => Debug.WriteLine("Loaded"); 
} 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     Debug.WriteLine("Navigated"); 
    } 

durante il salto avanti-indietro, l'uscita è

Navigated Loaded Navigated Loaded Navigated Loaded

Quindi, OnNavigated viene chiamato quando la pagina navigazione è fatto , ma prima (durante) i controlli della pagina sono caricato, mentre Loaded viene chiamato quando la pagina è pronta e tutti i comandi vengono caricati.

+0

Hmmm ... la risposta di Tigran sarebbe stata accettata allora? Mi chiedo se questo è ancora vero in 8.1 – Jedidja

1

In Windows Runtime, l'evento Loaded si attiverà sempre dopo OnNavigatedTo (anche quando le pagine vengono memorizzate nella cache impostando NavigationCacheMode.Required). Vitalii ha ragione su questo.

Secondo MSDN:

Nell'implementazione di Windows Runtime, l'evento Loaded è garantito a verificarsi dopo l'applicazione di un modello di controllo, e si può ottenere riferimenti a oggetti che vengono creati applicando il XAML modello.

Per il codice dell'app che utilizza la navigazione tra le pagine, non utilizzare Page.OnNavigatedTo per la manipolazione degli elementi o il cambio di stato dei controlli nella pagina di destinazione.Il metodo virtuale OnNavigatedTo è richiamato prima del caricamento del modello, pertanto gli elementi dei modelli non sono ancora disponibili. Allegare un gestore di eventi Loaded alla radice del contenuto della pagina appena caricata ed eseguire manipolazioni di qualsiasi elemento , modifiche dello stato, cablaggio degli eventi e così via nel gestore di eventi Loaded .

Ma c'è una buona ragione per cui si desidera utilizzare OnNavigatedTo: è l'unico posto in cui è possibile ottenere i parametri di navigazione. Se non si utilizzano mai i parametri di navigazione, utilizzare l'evento Loaded.

Problemi correlati