我什么时候应该使用UserControl而不是Page?

时间:2010-04-12 13:30:19

标签: wpf mvvm user-controls

我注意到许多WPF MVVM框架似乎避免使用NavigationWindow和Page控件来支持使用嵌套UserControls组合页面。

NavigationWindow和Page提供了在日志中启用后退和前进导航的简便方法,并提供了在页面之间传递数据的简便方法。我见过的大多数MVVM框架都以各种方式重新实现这些功能。

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

4 个答案:

答案 0 :(得分:10)

  

“NavigationWindow不存储   中的内容对象的实例   导航历史。代替,   NavigationWindow创建一个新的   每个内容对象的实例   它通过使用导航到的时间   导航历史。这种行为是   旨在避免过多的记忆   大数量消费时   正在发布大量内容   导航到。因此,国家   内容的记忆不会被记住   一个导航到下一个。然而,   WPF提供了几种技术   你可以存储一个州   用于导航中的一段内容   历史....“

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

答案 1 :(得分:3)

我刚发现UserControls和Pages之间的另一个区别:Pages不能用作DataTemplates。

例如,如果您使用MVVM样式创建应用程序,您可能希望这样做:

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

但是如果ProjectDashboardView是一个页面,它将会失败。

答案 2 :(得分:2)

我刚刚在Paul Stovell的网站上找到了一些与WPF NavigationWindow和Page相关的有趣信息。

他对NavigationWindow类有这个说法:

  

WPF包含一个名为NavigationWindow的类,它实际上是一个Window,它也可以通过实现大多数相同的接口而兼作Frame。一开始听起来很有用,但大多数时候你需要对Window进行更多控制,所以我从来没有必要使用这个类。我只是为了完整起见而指出它,尽管你的里程可能会有所不同。

在撰写他的Magellan WPF框架时,请参阅他在WPF NavigationMagellan and WPF Page management issues上遇到的深入文章。

答案 3 :(得分:1)

好吧,你仍然会使用usercontrols创建可重用的子组件,但对于app架构,它真的归结为用例。如果您正在构建典型的Web应用程序,那么Business / Navigation App应该没问题。如果你正在写游戏,那就不是了。同样,如果您正在做类似互动广告或媒体播放器的事情。