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

8

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

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

有没有特定的原因要避免使用NavigationWindow和Page?

4个回答

10
"NavigationWindow不会在导航历史记录中存储内容对象的实例。相反,每次使用导航历史记录导航到内容对象时,NavigationWindow都会创建一个新的内容对象实例。这种行为旨在避免在导航到大量和大块内容时出现过多的内存消耗。因此,从一次导航到下一次导航,内容的状态不会被记住。然而,WPF提供了几种技术,可以为导航历史记录中的内容存储一些状态信息..."

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


2
不错的发现。因此,NavigationWindow和Page类对于典型的业务应用程序可能不太相关。但仍然让我感到惊讶的是,很多MVVM框架完全避免使用它们。 - dthrasher

3

我刚刚发现了UserControls和Pages之间的另一个区别:页面不能用作数据模板。

例如,如果您正在使用MVVM风格创建应用程序,您可能希望以下内容能够正常工作:

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

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

在这种情况下,您希望页面在构造函数中接受视图模型,或从其他数据创建视图模型。通常,MVVM实现会希望使用PageFunction<T>。在页面中,您可以有一个包含视图模型的内容呈现器。页面是顶级组件。尝试将其视为内联窗口。 - Gusdor

2
我刚在Paul Stovell的网站上找到了一些与WPF NavigationWindow和Page相关的有趣信息。
他对NavigationWindow类说:
WPF包含一个名为NavigationWindow的类,它实际上是一个Window,同时也充当Frame,通过实现大多数相同的接口。这听起来很有用,但大多数时候你需要更多对于Window的控制,所以我从来没有使用过这个类。我只是出于完整性而指出它,尽管你的情况可能会有所不同。
请参阅他深入的文章WPF导航Magellan和WPF页面管理问题,他在编写他的Magellan WPF框架时遇到的问题。

1

嗯,你仍然需要使用用户控件来创建可重用的子组件,但是对于应用程序架构,实际上取决于用例。如果你正在构建一个典型的web应用程序,业务/导航应用程序应该就可以了。如果你正在写游戏,那就不一定了。同样,如果你在做互动广告或媒体播放器之类的事情,也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接