2010-04-12 15 views
8

Ich stelle fest, dass viele der WPF-MVVM-Frameworks zu vermeiden scheinen, die NavigationWindow- und Page-Steuerelemente zugunsten des Komponierens von Seiten mit geschachtelten UserControls zu verwenden.Wann sollte ich ein UserControl anstelle einer Seite verwenden?

Das NavigationWindow und die Seite bieten einfache Möglichkeiten zum Aktivieren und Deaktivieren der Navigation im Journal sowie zum einfachen Übertragen von Daten zwischen Seiten. Die meisten MVVM-Frameworks, die ich gesehen habe, haben diese Funktionen auf verschiedene Arten implementiert.

Gibt es einen bestimmten Grund zu vermeiden, NavigationWindow und Page zu verwenden?

Antwort

10

„Navigation nicht speichert eine Instanz eines Inhaltsobjektes in Navigation Geschichte. Stattdessen Navigation erstellt eine neue Instanz des Inhaltsobjekt jedes Zeit, es durch die Verwendung Geschichte Navigation navigiert wird. Diese Verhalten wird entwickelt, um übermäßigen Speicher Verbrauch zu vermeiden, wenn eine große Zahl und große Teile des Inhalts werden navigiert. Folglich ist der Zustand des Inhalts nicht von eine Navigation zum nächsten erinnert. Wie überhaupt, bietet WPF mehrere Techniken, die von , die Sie ein Stück Zustand für einen Teil des Inhalts in der Navigation Geschichte speichern ....“

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

+2

Guter Fang.Vielleicht sind die NavigationWindow- und Page-Klassen für eine typische Geschäftsanwendung etwas weniger relevant. Obwohl es mich immer noch überrascht, dass so viele MVVM-Frameworks sie vollständig vermeiden. – dthrasher

1

Nun, Sie werden immer noch Benutzersteuerelemente verwenden, um wiederverwendbare Unterkomponenten zu erstellen, aber wie bei der App-Architektur kommt es wirklich auf Anwendungsfall. Wenn Sie eine typische Web-Anwendung erstellen, sollte eine Business/Navigation-App in Ordnung sein. Wenn Sie ein Spiel schreiben, nicht so sehr. Ebenso, wenn Sie etwas wie eine interaktive Werbung oder einen Media Player machen.

2

ich nur einige weitere interessante Informationen gefunden im Zusammenhang mit WPF NavigationWindow und Page auf der Website von Paul Stovell.

Er hat dies über die Navigation Klasse zu sagen:

WPF enthält eine Klasse namens Navigation, die im Wesentlichen ein Fenster ist, das auch als Rahmen verdoppelt, von den meisten der gleichen Schnittstellen zu implementieren. Es klingt zunächst nützlich, aber die meiste Zeit benötigt man mehr Kontrolle über das Fenster, daher musste ich diese Klasse nie verwenden. Ich weise es nur der Vollständigkeit halber auf, obwohl Ihre Laufleistung variieren kann.

Siehe seinen profunden Artikel über WPF Navigation und die Magellan and WPF Page management issues er begegnet, wenn seine Magellan WPF Rahmen zu schreiben.

3

Ich entdeckte gerade einen weiteren Unterschied zwischen UserControls und Pages: Seiten können nicht als DataTemplates verwendet werden.

Zum Beispiel, wenn Sie die Anwendung kreierten die MVVM Stil benutzen, könnten Sie dies erwarten arbeiten:

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

Aber wenn die ProjectDashboardView eine Seite ist, wird es scheitern.

+0

In diesem Szenario möchten Sie, dass Ihre Seite entweder ein Ansichtsmodell im Konstruktor akzeptiert oder aus anderen Daten erstellt. Im Allgemeinen möchten MVVM-Implementierungen eine PageFunction verwenden. Auf Ihrer Seite haben Sie möglicherweise einen Content Presenter, der das Ansichtsmodell enthält. Seite ist eine Top-Level-Komponente. Versuchen Sie, es als Inline-Fenster zu betrachten. – Gusdor

Verwandte Themen