A Window object is just what it sounds like: its a new Window for your application. You should use it when you want to pop up an entirely new window. I don't often use more than one Window in WPF because I prefer to put dynamic content in my main Window that changes based on user action.
A Page is a page inside your Window. It is mostly used for web-based systems like an XBAP, where you have a single browser window and different pages can be hosted in that window. It can also be used in Navigation Applications like sellmeadog said.
A UserControl is a reusable user-created control that you can add to your UI the same way you would add any other control. Usually I create a UserControl when I want to build in some custom functionality (for example, a CalendarControl), or when I have a large amount of related XAML code, such as a View when using the MVVM design pattern.
When navigating between windows, you could simply create a new Window object and show it
var NewWindow = new MyWindow(); newWindow.Show();
but like I said at the beginning of this answer, I prefer not to manage multiple windows if possible.
My preferred method of navigation is to create some dynamic content area using a ContentControl, and populate that with a UserControl containing whatever the current view is.
<Window x:Class="MyNamespace.MainWindow" ...> <DockPanel> <ContentControl x:Name="ContentArea" /> </DockPanel> </Window>
and in your navigate event you can simply set it using
ContentArea.Content = new MyUserControl();
But if you're working with WPF, I'd highly recommend the MVVM design pattern. I have a very basic example on my blog that illustrates how you'd navigate using MVVM, using this pattern:
<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>
