窗口与页面与UserControl的WPF导航?

我想知道有人能帮助我。 我是WPF的新手,目前正在编写一个桌面应用程序,但是当把某人redirect到应用程序的新部分时,我似乎无法理解要使用什么东西。

我的select似乎是

  • 窗口
  • 用户控件

但我不明白他们之间的区别是什么,什么时候我应该使用每一个。

有人可以解释我的差异,并举例说明你可以使用哪种情况/应用程序?

一个Window对象就是它的声音:它是你的应用程序的一个新Window 。 你应该使用它,当你想popup一个全新的窗口。 我不经常在WPF中使用多个Window ,因为我更喜欢在基于用户操作的主窗口中添加dynamic内容。

页面是您的窗口内的页面。 它主要用于基于networking的系统,如XBAP,您只有一个浏览器窗口,可以在该窗口中托pipe不同的页面。 它也可以用在导航应用程序,如sellmeadog说 。

UserControl是一个可重复使用的用户创build的控件,您可以添加到您的用户界面,就像添加其他控件一样。 通常,当我想要构build一些自定义function(例如CalendarControl )时,或者在使用MVVMdevise模式时,如果有大量相关的XAML代码(如View时,我会创build一个UserControl

在窗口之间导航时,您可以简单地创build一个新的Window对象并显示它

 var NewWindow = new MyWindow(); newWindow.Show(); 

但就像我在这个答案的开头所说的,如果可能,我宁愿不pipe理多个窗口。

我最喜欢的导航方法是使用ContentControl创build一些dynamic内容区域,并使用包含当前视图的UserControl填充该内容区域。

 <Window x:Class="MyNamespace.MainWindow" ...> <DockPanel> <ContentControl x:Name="ContentArea" /> </DockPanel> </Window> 

并在您的导航事件中,您可以简单地使用它

 ContentArea.Content = new MyUserControl(); 

但是,如果你正在使用WPF,我会强烈推荐MVVMdevise模式。 我在我的博客上有一个非常基本的例子,它演示了如何使用MVVM导航,使用这种模式:

 <Window x:Class="SimpleMVVMExample.ApplicationView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SimpleMVVMExample" Title="Simple MVVM Example" Height="350" Width="525"> <Window.Resources> <DataTemplate DataType="{x:Type local:HomeViewModel}"> <local:HomeView /> <!-- This is a UserControl --> </DataTemplate> <DataTemplate DataType="{x:Type local:ProductsViewModel}"> <local:ProductsView /> <!-- This is a UserControl --> </DataTemplate> </Window.Resources> <DockPanel> <!-- Navigation Buttons --> <Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0"> <ItemsControl ItemsSource="{Binding PageViewModels}"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="{Binding Name}" Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding }" Margin="2,5"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Border> <!-- Content Area --> <ContentControl Content="{Binding CurrentPageViewModel}" /> </DockPanel> </Window> 

Screenshot1Screenshot2

  • 窗口就像Windows.Forms.Form ,所以只是一个新的窗口
  • 网页是根据在线文档 :

    封装一个可导航到Windows Internet Explorer,NavigationWindow和Frame的内容页面。

    所以你基本上使用这个,如果你去可视化一些HTML内容

  • UserControl是用于您想要创build一些可重用组件(但不是独立的组件)以在多个不同的Windows使用它的情况

一切取决于你正在试图build立的应用程序。 如果您正在构build基于对话框的应用程序,请使用Window 。 如果您正在构build基于导航的应用程序,请使用Pages 。 无论你走的方向如何, UserControl都是有用的,因为你可以在Windows和Pages中使用它们。

开始探索的好地方是: http : //windowsclient.net/learn

我们通常为应用程序使用一个主窗口,其他窗口可用于需要popup窗口的情况,因为不使用XAML中不可见的popup窗口控件,而是使用在devise时可见的窗口,容易工作

另一方面,我们使用许多页面从一个屏幕导航到另一个像用户pipe理屏幕到订单屏幕等在主窗口,我们可以使用Fram控制导航像下面的XAML

  <Frame Name="mainWinFrame" NavigationUIVisibility="Hidden" ButtonBase.Click="mainWinFrame_Click"> </Frame> 

C#

  private void mainWinFrame_Click(object sender, RoutedEventArgs e) { try { if (e.OriginalSource is Button) { Button btn = (Button)e.OriginalSource; if ((btn.CommandParameter != null) && (btn.CommandParameter.Equals("Order"))) { mainWinFrame.Navigate(OrderPage); } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); } } 

这是做这件事的一种方法我们也可以使用Tab控件而不是Fram,并使用Dictionary添加页面,同时添加新页面检查控件是否已经存在,然后只能导航,否则添加和导航。 我希望这会帮助别人

大部分都发布了正确的答案。 我想添加几个链接,以便您可以参考他们,并有相同的清晰和更好的想法:

UserControl: http : //msdn.microsoft.com/en-IN/library/a6h7e207( v= vs.71).aspx

页面和窗口之间的区别WPF: 页面和WPF中的窗口?