2012-02-22 18 views
6

En varios ejemplos en línea me encontré con esto:OnNavigatedTo vs evento Load

public partial class ForecastPage : PhoneApplicationPage 
{ 
    Forecast forecast; 

    public ForecastPage() 
    { 
     InitializeComponent(); 
    } 

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

pero en otros me encontré con el uso del evento Load como

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

Sé que OnNavigatedTo incendios antes del evento Load , pero ambos se disparan antes de que la UI se dibuje en el teléfono, por lo que mi pregunta es ¿Hay alguna ventaja en uso un método del otro?

+1

Si está realizando una gran cantidad de inicializaciones, querrá usar Loaded en lugar de OnNavigatedTo o, de lo contrario, su página puede tardar un poco en cargarse. – brendan

Respuesta

7

lectura de la documentación sobre OnNavigatedTo:

llama cuando una página se convierte en la página activa en un marco.

y cuando leemos acerca de Loaded caso, véase:

Ocurre cuando un FrameworkElement se ha construido y se añade al árbol objeto.

son completamente diferentes, como la página, corrígeme si me equivoco, puede convertirse en active más de una vez durante la duración de la aplicación, pero constuction del FrameworkElement generalmente ocurre una vez.

+0

Algunos de los ejemplos de MSFT (ej. Http://msdn.microsoft.com/library/windows/apps/ff967547(v=vs.105).aspx) ponen su código en OnNavigatedTo y usan un bool en el constructor de la página para determinar si se debe ejecutar. – Jedidja

23

No estoy de acuerdo 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"); 
    } 

mientras que salta adelante-atrás, la salida es

Navigated Cargado Navigated Cargado Navigated Loaded

Así, OnNavigated se llama cuando la página navegación se hace , pero antes (durante) los controles de página son cargado, mientras se llama al Loaded cuando la página está lista y todos los controles se cargan.

+0

Hmmm ... ¿debería haberse aceptado la respuesta de Tigran entonces? Me pregunto si esto sigue siendo cierto en 8.1 – Jedidja

1

En Windows Runtime, el evento cargado siempre se activará después de OnNavigatedTo (incluso cuando las páginas se almacenan en caché al configurar NavigationCacheMode.Required). Vitalii tiene razón sobre eso.

De acuerdo con MSDN:

En la implementación de Windows en tiempo de ejecución, el evento Loaded está garantizada a producirse después de aplicar una plantilla de control, y se puede obtener referencias a objetos que se crean mediante la aplicación del XAML modelo.

Para el código de la aplicación que usa la navegación entre las páginas, no use Página.OnNavigatedTo para la manipulación de elementos o el cambio de estado de los controles en la página de destino.El método virtual OnNavigatedTo es invocado antes de que se cargue la plantilla, por lo que los elementos de las plantillas aún no están disponibles. En su lugar, conecte un controlador de eventos cargado en la raíz del contenido de la página recién cargada y realice cualquier manipulación de elementos , cambios de estado, cableado de eventos, etc. en el controlador de eventos Loaded .

Pero hay una buena razón por la que desea utilizar OnNavigatedTo: es el único lugar donde puede obtener los parámetros de navegación. Si nunca usa los parámetros de navegación, use el evento Loaded.