2010-04-12 107 views
8

我注意到許多WPF MVVM框架似乎避免使用NavigationWindow和Page控件來支持使用嵌套UserControls組合頁面。什麼時候應該使用UserControl而不是Page?

導航窗口和頁面提供了簡單的方法來在日誌中啓用後退和前進導航,並提供了一種在頁面之間傳遞數據的簡單方法。我見過的大多數MVVM框架都以各種方式重新實現這些功能。

是否有避免使用NavigationWindow和Page的特定原因?

回答

10

「NavigationWindow沒有內容對象的 實例存儲在 導航歷史,而是 NavigationWindow使用 導航歷史創建內容對象的新 實例的每個 一次被導航到這行爲 設計,以避免過多的內存消耗 當大量和 大塊的內容被 導航到,因此,內容的狀態 不是從 一個導航記得下。如何以往, WPF通過 其中可以儲存一段狀態 的在導航 歷史上的一段內容提供了多種技術......」

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

+2

好的。所以也許NavigationWindow和Page類與一個典型的業務線應用程序有點不太相關。儘管如此多的MVVM框架完全避免它們,但我仍然感到意外。 – dthrasher 2010-04-19 17:52:31

1

那麼,你仍然會使用usercontrols來創建可重用的子組件,但就應用程序架構而言,它歸結爲真正的用例。如果您正在構建典型的Web應用程序,則Business/Navigation應用程序應該沒問題。如果你正在寫一個遊戲,不是很多。同樣,如果你正在做一些互動廣告或媒體播放器。

2

我只是發現了一些其他有趣的信息涉及WPF NavigationWindow和Paul Stovell網站上的Page。

他有這樣說的NavigationWindow類:

WPF包括一個名爲NavigationWindow類,它本質上是一個窗口,它也兼作框架,通過實施最相同的接口。這聽起來很有用,但大多數時候你需要更多的控制窗口,所以我從來沒有任何需要使用這個類。我只是爲了完整性而指出它,儘管你的里程可能會有所不同。

見他對WPF Navigation深入的文章,寫他的麥哲倫WPF框架時,他遇到了Magellan and WPF Page management issues

3

我剛剛發現UserControls和Pages之間的另一個區別:頁面不能用作DataTemplates。

例如,如果你使用的MVVM風格創建應用程序,你可能會想到這個工作:

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

但如果ProjectDashboardView是一個頁面,它會失敗。

+0

在這種情況下,您希望頁面在構造函數中接受視圖模型,或者從其他數據創建視圖模型。一般來說,MVVM的實現會希望使用PageFunction 。在您的頁面中,您可能有一個包含視圖模型的內容展示器。頁面是頂層組件。嘗試將其視爲內聯窗口。 – Gusdor 2013-05-28 11:26:40

相關問題