Obiekt Window jest dokładnie tak, jak brzmi: jest nowy Window
dla Twojej aplikacji. Powinieneś go użyć, gdy chcesz wyskoczyć całkowicie nowe okno. Często nie używam więcej niż jednego Window
w WPF, ponieważ wolę umieszczać dynamiczną zawartość w moim głównym oknie, która zmienia się w zależności od działania użytkownika.
Strona to strona wewnątrz okna. Jest to najczęściej używane w systemach internetowych, takich jak XBAP, w których masz jedno okno przeglądarki i w tym oknie mogą być hostowane różne strony. Można go również używać w aplikacjach nawigacyjnych, takich jak Sellmeadog .
UserControl jest wielokrotnego użytku, tworzone przez użytkowników sterowania, który można dodać do interfejsu w taki sam sposób chcesz dodawać żadnych innych kontroli. Zwykle tworzę, UserControl
gdy chcę zbudować jakąś niestandardową funkcjonalność (na przykład a CalendarControl
) lub gdy mam dużą ilość pokrewnego kodu XAML, na przykład View
gdy używam wzorca projektowego MVVM.
Podczas nawigacji między oknami możesz po prostu utworzyć nowy Window
obiekt i go pokazać
var NewWindow = new MyWindow();
newWindow.Show();
ale jak powiedziałem na początku tej odpowiedzi, wolę nie zarządzać wieloma oknami, jeśli to możliwe.
Moją preferowaną metodą nawigacji jest utworzenie dynamicznego obszaru zawartości za pomocą i ContentControl
, i wypełnienie go UserControl
zawartym w nim bieżącym widokiem.
<Window x:Class="MyNamespace.MainWindow" ...>
<DockPanel>
<ContentControl x:Name="ContentArea" />
</DockPanel>
</Window>
a w zdarzeniu nawigacyjnym możesz to po prostu ustawić za pomocą
ContentArea.Content = new MyUserControl();
Ale jeśli pracujesz z WPF, gorąco polecam wzorzec projektowy MVVM. Mam bardzo prosty przykład na moim blogu, który ilustruje sposób nawigowania za pomocą MVVM, przy użyciu tego wzorca:
<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>