2010-04-12 3 views
8

Ho notato che molti dei framework MVVM di WPF sembrano evitare di utilizzare i controlli NavigationWindow e Page in favore della composizione di pagine utilizzando UserControls nidificati.Quando dovrei usare un UserControl al posto di una Pagina?

Il NavigationWindow e pagina forniscono semplici modi per consentire di nuovo e la navigazione in avanti nella rivista, oltre a fornire un modo semplice per trasferire i dati tra le pagine. La maggior parte dei framework MVVM che ho visto ri-implementa queste funzionalità in vari modi.

C'è un motivo specifico per evitare l'uso di NavigationWindow e pagina?

risposta

10

"NavigationWindow non memorizza un istanza di un oggetto contenuto nella cronologia di navigazione. Invece, NavigationWindow crea una nuova istanza dell'oggetto contenuto di ogni volta che viene navigato per utilizzando cronologia di navigazione. Questo comportamento è progettato per evitare eccessivo di memoria consumo quando grandi numeri e grandi pezzi di contenuti vengono navigato a. di conseguenza, lo stato del contenuto non è ricordato da una navigazione al successivo. Come mai, WPF offre diverse tecniche per cui è possibile memorizzare un pezzo di Stato per un pezzo di contenuto di navigazione storia ...."

http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationwindow.aspx

+2

Buona cattura.Quindi, forse le classi NavigationWindow e Page sono un po 'meno rilevanti per una tipica linea di business application. Anche se mi sorprende ancora che così tanti framework MVVM li evitino completamente. – dthrasher

1

Bene, si sta ancora andando ad utilizzare usercontrols per creare componenti secondari riutilizzabili, ma per quanto riguarda l'architettura app, si tratta di usare caso davvero. Se stai realizzando una tipica applicazione Web, un'app Business/Navigazione dovrebbe andare bene. Se stai scrivendo un gioco, non così tanto. Allo stesso modo se stai facendo qualcosa come un annuncio interattivo o un lettore multimediale.

2

ho appena trovato alcune altre informazioni interessanti relativo a WPF NavigationWindow e Page sul sito Web di Paul Stovell.

Egli ha da dire sulla classe NavigationWindow:

WPF include una classe denominata NavigationWindow, che è essenzialmente una finestra che funge anche da un frame, attuando maggior parte delle stesse interfacce. All'inizio sembra utile, ma il più delle volte è necessario un maggiore controllo sulla finestra, quindi non ho mai avuto bisogno di usare questa classe. Lo sto solo indicando per completezza, anche se il tuo chilometraggio può variare.

Vedere il suo articolo di approfondimento sul WPF Navigation e Magellan and WPF Page management issues ha incontrato quando scrive il suo quadro Magellan WPF.

3

Ho appena scoperto un'altra differenza tra UserControls e Pages: Pages non può essere utilizzato come DataTemplates.

Ad esempio, se si vuole creare applicazioni utilizzando lo stile MVVM, ci si potrebbe aspettare questo lavoro:

<DataTemplate DataType="{x:Type ViewModels:ProjectDashboardViewModel}"> 
     <Views:ProjectDashboardView /> 
    </DataTemplate> 

Ma se la ProjectDashboardView è una pagina, fallirà.

+0

In questo scenario, si desidera che la pagina accetti un modello di vista nel costruttore o lo crei da altri dati. In generale, le implementazioni MVVM vorrebbero utilizzare un PageFunction . All'interno della tua pagina, potresti avere un content presenter contenente il modello di visualizzazione. La pagina è componente di livello superiore. Prova a pensarlo come una finestra in linea. – Gusdor