Um objeto Window é exatamente o que parece: é um novo Window
para o seu aplicativo. Você deve usá-lo quando desejar abrir uma janela totalmente nova. Geralmente não uso mais de um Window
no WPF porque prefiro colocar conteúdo dinâmico na minha janela principal que muda com base na ação do usuário.
Uma página é uma página dentro da sua janela. É usado principalmente para sistemas baseados na Web como um XBAP, onde você tem uma única janela do navegador e páginas diferentes podem ser hospedadas nessa janela. Também pode ser usado em aplicativos de navegação, como o sellmeadog disse .
Um UserControl é um controle reutilizável criado pelo usuário que você pode adicionar à sua interface do usuário da mesma maneira que adicionaria qualquer outro controle. Geralmente, eu crio um UserControl
quando quero criar alguma funcionalidade personalizada (por exemplo, a CalendarControl
) ou quando tenho uma grande quantidade de código XAML relacionado, como um View
ao usar o padrão de design MVVM.
Ao navegar entre janelas, você pode simplesmente criar um novo Window
objeto e mostrá-lo
var NewWindow = new MyWindow();
newWindow.Show();
mas como eu disse no começo desta resposta, prefiro não gerenciar várias janelas, se possível.
Meu método preferido de navegação é criar uma área de conteúdo dinâmico usando a ContentControl
e preenchê-la com uma que UserControl
contenha a visualização atual.
<Window x:Class="MyNamespace.MainWindow" ...>
<DockPanel>
<ContentControl x:Name="ContentArea" />
</DockPanel>
</Window>
e no seu evento de navegação, você pode simplesmente configurá-lo usando
ContentArea.Content = new MyUserControl();
Mas se você estiver trabalhando com o WPF, recomendo o padrão de design do MVVM. Eu tenho um exemplo muito básico no meu blog que ilustra como você navegaria usando o MVVM, usando este padrão:
<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>