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>
AuditViewModel
wszystkie dane i funkcje dla tego formularza, i narysowałbym go za pomocąAuditView
UserControl, lub po prostuDataTemplate
ViewModel
Zazwyczaj jest budowany dlaView
, podczas gdyModels
są to obiekty danych i klasy („bloki konstrukcyjne”) używane przez twoją aplikację (ViewModels
)TabControl.ItemsSource
kolekcję obiektów i używam DataTemplates, aby powiedzieć WPF, jak narysować każdy typ obiektu na każdej karcie. Zazwyczaj coś jak tenWindows.Forms.Form
, więc tylko nowe oknoStrona jest zgodnie z dokumentacją online :
Tak więc w zasadzie używasz tego, jeśli wizualizujesz część treści HTML
UserControl jest przeznaczony do przypadków, gdy chcesz utworzyć jakiś komponent wielokrotnego użytku (ale nie samodzielny), aby używać go w wielu różnych
Windows
źródło
UserControl
w przypadku, gdy uważasz, że ten sam zestaw kontrolek, którego użyjesz w tym oknie, będziesz używać również w innym, więc zamiast pisać podwójny kod, po prostu stwórzUserControl
, ale jeśli nie, po prostu umieść elementy sterujące do wizualizacji twoje dane naWindow
sobie, po prawej stronie od wspomnianych przycisków.DataTemplates
. Są one używane, gdy chcesz powiedzieć WPF, jak narysować element w określonym zakresie. Na przykład, jeśli chcesz zwrócićButtons
być okrągły koła, można po prostu użyćDataTemplate
zamiastUserControl
. Zwykle używam,UserControls
gdy chcę nowego formantu z własną funkcjonalnością lub gdy mam dużo XAML dla pojedynczego komponentu, na przykład dlaView
. W przypadku mniejszych fragmentów XAML, które nie wymagają żadnej specjalnej funkcjonalności, należy użyćDataTemplate
zamiast tworzeniaUserControl
Page
nie jest HTMLem, ale XAML. JednakPage
jest powiązany z ramami nawigacji, które są koncepcyjnie podobne do sposobu nawigacji w przeglądarce internetowej. (A strony mogą być nawet hostowane w przeglądarce, jeśli aplikacja jest aplikacją XBAP.)Wszystko zależy od aplikacji, którą próbujesz zbudować. Użyj
Window
s, jeśli budujesz aplikację opartą na oknie dialogowym. UżyjPage
s, jeśli tworzysz aplikację do nawigacji .UserControl
s przydadzą się niezależnie od tego, w którą stronę pójdziesz, ponieważ możesz ich używać zarówno w systemie Windows, jak i Pages.Dobrym miejscem do rozpoczęcia odkrywania jest tutaj: http://windowsclient.net/learn
źródło
Zwykle używamy One Main
Window
do aplikacji, a innych okien można używać w sytuacjach, gdy potrzebujesz wyskakujących okienek, ponieważ zamiast używania kontrolek wyskakujących w XAML, które nie są widoczne, możemy użyć okna widocznego w czasie projektowania, aby było to łatwe pracować zz drugiej strony korzystamy z wielu stron do nawigacji między ekranami, np. ekran zarządzania użytkownikami do ekranu zamówień itp. W głównym oknie możemy
Frame
sterować nawigacją jak poniżej XAMLDO#
Jest to jeden ze sposobów na to. Możemy również użyć Kontrolki Tab zamiast Ramki i Dodawaj do niej strony za pomocą Słownika, dodając nową stronę, sprawdzając, czy kontrolka już istnieje, a następnie nawiguj tylko w inny sposób dodawaj i nawiguj. Mam nadzieję, że to komuś pomoże
źródło
Przede wszystkim opublikował poprawną odpowiedź. Chciałbym dodać kilka linków, abyście mogli się do nich odwołać i mieć jasne i lepsze pomysły na ten temat:
UserControl: http://msdn.microsoft.com/en-IN/library/a6h7e207(v=vs.71).aspx
Różnica między stroną a oknem w odniesieniu do WPF: strona czy okno w WPF?
źródło