it-swarm.com.de

Window vs Page vs UserControl für die WPF-Navigation?

Ich schreibe gerade eine Desktop-Anwendung, kann mich aber nicht darauf konzentrieren, wie ich jemanden zu einem neuen Abschnitt der Anwendung weiterleiten soll.

Meine Optionen scheinen zu sein

  • Fenster
  • Seite
  • Nutzerkontrolle

aber ich verstehe nicht, was der Unterschied zwischen ihnen ist und wann ich jeden verwenden sollte.

Könnte jemand die Unterschiede für mich erklären und ein Beispiel dafür geben, für welche Situationen/Anwendungen Sie die einzelnen verwenden könnten?

181
Steve

Ein Window Objekt ist genau das, wonach es sich anhört: Es ist ein neues Window für Ihre Anwendung. Sie sollten es verwenden, wenn Sie ein völlig neues Fenster öffnen möchten. Ich verwende in WPF nicht oft mehr als ein Window, weil ich dynamische Inhalte in meinem Hauptfenster ablegen möchte, die sich aufgrund von Benutzeraktionen ändern.

Eine Seite ist eine Seite in Ihrem Fenster. Es wird hauptsächlich für webbasierte Systeme wie XBAP verwendet, bei denen Sie ein einziges Browserfenster haben und in diesem Fenster verschiedene Seiten gehostet werden können. Es kann auch in Navigationsanwendungen wie sellmeadog sagte verwendet werden.

Ein UserControl ist ein wiederverwendbares benutzerdefiniertes Steuerelement, das Sie wie jedes andere Steuerelement zu Ihrer Benutzeroberfläche hinzufügen können. Normalerweise erstelle ich ein UserControl, wenn ich eine benutzerdefinierte Funktionalität einbauen möchte (z. B. ein CalendarControl) oder wenn ich eine große Menge verwandten XAML-Codes habe, z. B. ein View bei Verwendung des MVVM-Entwurfsmusters.

Wenn Sie zwischen Fenstern navigieren, können Sie einfach ein neues Window -Objekt erstellen und anzeigen

var NewWindow = new MyWindow();
newWindow.Show();

aber wie ich zu Beginn dieser Antwort sagte, bevorzuge ich es, wenn möglich, nicht mehrere Fenster zu verwalten.

Meine bevorzugte Navigationsmethode besteht darin, einen dynamischen Inhaltsbereich mit einem ContentControl zu erstellen und diesen mit einem UserControl auszufüllen, der die aktuelle Ansicht enthält.

<Window x:Class="MyNamespace.MainWindow" ...>
    <DockPanel>
        <ContentControl x:Name="ContentArea" />
    </DockPanel>
</Window>

und in Ihrem Navigationsereignis können Sie es einfach mit einstellen

ContentArea.Content = new MyUserControl();

Wenn Sie jedoch mit WPF arbeiten, kann ich das MVVM-Entwurfsmuster nur empfehlen. Ich habe ein sehr grundlegendes Beispiel in meinem Blog , das veranschaulicht, wie Sie mit MVVM nach folgendem Muster navigieren würden:

<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>

Screenshot1Screenshot2

320
Rachel
  • Fenster ist wie Windows.Forms.Form, also nur ein neues Fenster
  • Seite ist laut Online-Dokumentation :

    Verkapselt eine Inhaltsseite, die von Windows Internet Explorer, NavigationWindow und Frame aufgerufen und gehostet werden kann.

    Sie verwenden dies also im Grunde, wenn Sie HTML-Inhalte visualisieren möchten

  • UserControl ist für Fälle vorgesehen, in denen Sie eine wiederverwendbare Komponente (aber keine eigenständige) erstellen möchten, um sie in mehreren verschiedenen Windows zu verwenden.

13
Tigran

Alles hängt von der App ab, die Sie erstellen möchten. Verwenden Sie Windows, wenn Sie eine dialogbasierte App erstellen. Verwenden Sie Pages, wenn Sie eine navigationsbasierte App erstellen. UserControls ist unabhängig von der Richtung, in die Sie gehen, nützlich, da Sie sie sowohl in Windows als auch in Pages verwenden können.

Ein guter Ort, um zu erkunden, ist hier: http://windowsclient.net/learn

5
sellmeadog

Wir verwenden normalerweise ein Hauptfenster für die Anwendung und andere Fenster können in Situationen verwendet werden, in denen Sie Popups benötigen, da wir anstelle von nicht sichtbaren Popup-Steuerelementen in XAML ein Fenster verwenden können, das zur Entwurfszeit sichtbar ist leicht damit zu arbeiten

auf der anderen Seite verwenden wir viele Seiten, um von einem Bildschirm zum anderen zu navigieren, wie z. B. Benutzerverwaltungsbildschirm zum Bestellbildschirm usw. Im Hauptfenster können wir die Fram-Steuerung für die Navigation wie unter XAML verwenden

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

C #

     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");
        }
    }

Das ist eine Möglichkeit, dies zu tun. Wir können auch ein Tab-Steuerelement anstelle von Fram verwenden und Seiten mithilfe eines Wörterbuchs hinzufügen, während Sie eine neue Seitenüberprüfung hinzufügen. Wenn das Steuerelement bereits vorhanden ist, navigieren Sie nur, andernfalls, und navigieren Sie. Ich hoffe das hilft jemandem

3
dnxit

Am allermeisten hat die richtige Antwort gepostet. Ich möchte einige Links hinzufügen, damit Sie darauf verweisen und klare und bessere Ideen dazu haben:

UserControl: http://msdn.Microsoft.com/en-IN/library/a6h7e207 (v = vs.71) .aspx

Der Unterschied zwischen Seite und Fenster in Bezug auf WPF: Seite vs Fenster in WPF?

2
Hitesh