Window vs. Page vs. UserControl do nawigacji WPF?


192

Obecnie piszę aplikację komputerową, ale nie mogę się zastanowić, czego użyć, gdy przekierowuję kogoś do nowej sekcji aplikacji.

Moje opcje wydają się być

  • Okno
  • Strona
  • UserControl

ale nie rozumiem, jaka jest różnica między nimi i kiedy powinienem użyć każdego z nich.

Czy ktoś mógłby mi wyjaśnić różnice i podać przykład, w jakich sytuacjach / aplikacjach możesz użyć każdego z nich?

Odpowiedzi:


337

Obiekt Window jest dokładnie tak, jak brzmi: jest nowy Windowdla Twojej aplikacji. Powinieneś go użyć, gdy chcesz wyskoczyć całkowicie nowe okno. Często nie używam więcej niż jednego Windoww 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ę, UserControlgdy chcę zbudować jakąś niestandardową funkcjonalność (na przykład a CalendarControl) lub gdy mam dużą ilość pokrewnego kodu XAML, na przykład Viewgdy używam wzorca projektowego MVVM.

Podczas nawigacji między oknami możesz po prostu utworzyć nowy Windowobiekt 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 UserControlzawartym 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>

Zrzut ekranu 1 Screenshot2


Mam pytanie, MVVM z tego, co mogę powiedzieć, wydaje się działać dobrze z zestawami danych, ale co z formami statycznymi, takimi jak na przykład formularz wejścia do audytu. Czy powinienem używać strony lub kontroli użytkownika dla stron statycznych?
Herrozerro

2
@Herrozerro Gdybym chciał zrobić formularz audytu przy użyciu MVVM, miałbym AuditViewModelwszystkie dane i funkcje dla tego formularza, i narysowałbym go za pomocą AuditViewUserControl, lub po prostuDataTemplate
Rachel

1
Dzięki! Właściwie po przejrzeniu twojego bloga i kilku innych stron lepiej rozumiem, jak działa MVVM.
Herrozerro,

1
@Herrozerro ViewModelZazwyczaj jest budowany dla View, podczas gdy Modelssą to obiekty danych i klasy („bloki konstrukcyjne”) używane przez twoją aplikację ( ViewModels)
Rachel

1
@ GTS13 Tak. Często to robię. Łączę TabControl.ItemsSourcekolekcję obiektów i używam DataTemplates, aby powiedzieć WPF, jak narysować każdy typ obiektu na każdej karcie. Zazwyczaj coś jak ten
Rachel

13
  • Okno jest jak Windows.Forms.Form, więc tylko nowe okno
  • Strona jest zgodnie z dokumentacją online :

    Hermetyzuje stronę treści, którą można nawigować i hostować w Windows Internet Explorer, NavigationWindow i Frame.

    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óżnychWindows


Dziękuję za Twoją odpowiedź. Na przykład, jeśli tworzysz aplikację, która ma przyciski po lewej stronie, ale chcesz zobaczyć zawartość tych przycisków po prawej stronie, użyłbyś kontroli użytkownika?
Steve

@ Steve: użyj UserControlw 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órz UserControl, ale jeśli nie, po prostu umieść elementy sterujące do wizualizacji twoje dane na Windowsobie, po prawej stronie od wspomnianych przycisków.
Tigran

6
Jest jeszcze jeden element, który myślę, że powinien być dodany: DataTemplates. Są one używane, gdy chcesz powiedzieć WPF, jak narysować element w określonym zakresie. Na przykład, jeśli chcesz zwrócić Buttonsbyć okrągły koła, można po prostu użyć DataTemplatezamiast UserControl. Zwykle używam, UserControlsgdy chcę nowego formantu z własną funkcjonalnością lub gdy mam dużo XAML dla pojedynczego komponentu, na przykład dla View. W przypadku mniejszych fragmentów XAML, które nie wymagają żadnej specjalnej funkcjonalności, należy użyć DataTemplatezamiast tworzeniaUserControl
Rachel

3
Ogólnie rzecz biorąc, zawartość a Pagenie jest HTMLem, ale XAML. Jednak Pagejest 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.)
Martin Liversage

6

Wszystko zależy od aplikacji, którą próbujesz zbudować. Użyj Windows, jeśli budujesz aplikację opartą na oknie dialogowym. Użyj Pages, jeśli tworzysz aplikację do nawigacji . UserControls 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


5

Zwykle używamy One Main Windowdo 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ć z

z 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 Framesterować nawigacją jak poniżej XAML

    <Frame Name="mainWinFrame" NavigationUIVisibility="Hidden"  ButtonBase.Click="mainWinFrame_Click">
    </Frame>

DO#

     private void mainWinFrame_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (e.OriginalSource is Button)
            {
                Button btn = (Button)e.OriginalSource;

                if ((btn.CommandParameter != null) && (btn.CommandParameter.Equals("Order")))
                {

                    mainWinFrame.Navigate(OrderPage);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
        }
    }

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.