Un objeto Window es exactamente lo que parece: es nuevo Window
para su aplicación. Debe usarlo cuando desee abrir una ventana completamente nueva. No suelo usar más de unoWindow
en WPF porque prefiero poner contenido dinámico en mi ventana principal que cambia según la acción del usuario.
Una página es una página dentro de su ventana. Se utiliza principalmente para sistemas basados en la web como XBAP, donde tiene una sola ventana del navegador y se pueden alojar diferentes páginas en esa ventana. También se puede usar en aplicaciones de navegación como sellmeadog, dijo .
Un UserControl es un control reutilizable creado por el usuario que puede agregar a su IU de la misma manera que agregaría cualquier otro control. Por lo general, creo un UserControl
cuando quiero incorporar alguna funcionalidad personalizada (por ejemplo, a CalendarControl
), o cuando tengo una gran cantidad de código XAML relacionado, como View
cuando uso el patrón de diseño MVVM.
Al navegar entre ventanas, simplemente puede crear un nuevo Window
objeto y mostrarlo
var NewWindow = new MyWindow();
newWindow.Show();
pero como dije al comienzo de esta respuesta, prefiero no administrar varias ventanas si es posible.
Mi método preferido de navegación es crear un área de contenido dinámico usando a ContentControl
, y llenarla con un UserControl
contenido cualquiera sea la vista actual.
<Window x:Class="MyNamespace.MainWindow" ...>
<DockPanel>
<ContentControl x:Name="ContentArea" />
</DockPanel>
</Window>
y en su evento de navegación simplemente puede configurarlo usando
ContentArea.Content = new MyUserControl();
Pero si está trabajando con WPF, le recomiendo el patrón de diseño MVVM. Tengo un ejemplo muy básico en mi blog que ilustra cómo navegarías usando MVVM, usando este patrón:
<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>