Window vs Page vs UserControl pour la navigation WPF?

192

J'écris actuellement une application de bureau, mais je n'arrive pas à comprendre quoi utiliser pour rediriger quelqu'un vers une nouvelle section de l'application.

Mes options semblent être

  • La fenêtre
  • Page
  • UserControl

mais je ne comprends pas quelle est la différence entre eux et quand je devrais les utiliser.

Quelqu'un pourrait-il m'expliquer les différences et donner un exemple des situations / applications pour lesquelles vous pouvez utiliser chacun d'eux?

Steve
la source

Réponses:

338

Un objet Window est exactement ce à quoi il ressemble: c'est une nouveauté Windowpour votre application. Vous devez l'utiliser lorsque vous souhaitez ouvrir une toute nouvelle fenêtre. Je n'en utilise pas souvent plus d'un Windowdans WPF car je préfère mettre du contenu dynamique dans ma fenêtre principale qui change en fonction de l'action de l'utilisateur.

Une page est une page à l'intérieur de votre fenêtre. Il est principalement utilisé pour les systèmes Web comme XBAP, où vous avez une seule fenêtre de navigateur et différentes pages peuvent être hébergées dans cette fenêtre. Il peut également être utilisé dans les applications de navigation comme le dit sellmeadog .

Un UserControl est un contrôle réutilisable créé par l'utilisateur que vous pouvez ajouter à votre interface utilisateur de la même manière que vous ajouteriez tout autre contrôle. Habituellement, je crée un UserControllorsque je souhaite intégrer des fonctionnalités personnalisées (par exemple, a CalendarControl), ou lorsque j'ai une grande quantité de code XAML associé, comme Viewlors de l'utilisation du modèle de conception MVVM.

Lors de la navigation entre les fenêtres, vous pouvez simplement créer un nouvel Windowobjet et l'afficher

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

mais comme je l'ai dit au début de cette réponse, je préfère ne pas gérer plusieurs fenêtres si possible.

Ma méthode de navigation préférée consiste à créer une zone de contenu dynamique à l'aide de a ContentControlet à la remplir avec un UserControlcontenant quelle que soit la vue actuelle.

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

et dans votre événement de navigation, vous pouvez simplement le définir en utilisant

ContentArea.Content = new MyUserControl();

Mais si vous travaillez avec WPF, je vous recommande vivement le modèle de conception MVVM. J'ai un exemple très basique sur mon blog qui illustre comment vous navigueriez en utilisant MVVM, en utilisant ce modèle:

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

Capture d'écran1 Capture d'écran2

Rachel
la source
J'ai une question, MVVM d'après ce que je peux dire semble bien fonctionner avec des ensembles de données, mais qu'en est-il des formulaires statiques comme par exemple un formulaire d'entrée pour un audit. Dois-je utiliser une page ou un contrôle utilisateur pour les pages statiques?
Herrozerro
2
@Herrozerro Si je voulais créer un formulaire d'audit à l'aide de MVVM, j'aurais un AuditViewModelcontenant toutes les données et fonctionnalités du formulaire, et je le dessinerais en utilisant soit un AuditViewUserControl, soit juste unDataTemplate
Rachel
1
Merci! En fait, après avoir parcouru votre blog et quelques autres sites, j'ai une meilleure compréhension du fonctionnement de MVVM.
Herrozerro
1
@Herrozerro Le ViewModelest généralement construit pour le View, tandis que le Modelssont les objets de données et les classes ("blocs de construction") utilisés par votre application ( ViewModels)
Rachel
1
@ GTS13 Oui, je le fais fréquemment. Je lie le TabControl.ItemsSourceà une collection d'objets et j'utilise des DataTemplates pour indiquer à WPF comment dessiner chaque type d'objet sur chaque onglet. Habituellement quelque chose comme ça
Rachel
13
  • La fenêtre est comme Windows.Forms.Form, donc juste une nouvelle fenêtre
  • La page est, selon la documentation en ligne :

    Encapsule une page de contenu qui peut être consultée et hébergée par Windows Internet Explorer, NavigationWindow et Frame.

    Donc, vous utilisez essentiellement ceci si vous visualisez du contenu HTML

  • UserControl est destiné aux cas où vous souhaitez créer un composant réutilisable (mais pas autonome) pour l'utiliser dans plusieursWindows

Tigran
la source
Merci pour votre réponse. Ainsi, par exemple, si vous construisiez une application qui avait des boutons sur la gauche mais que vous vouliez voir le contenu de ces boutons sur le côté droit, vous utiliseriez un contrôle utilisateur?
Steve
@Steve: à utiliser UserControldans le cas où vous pensez que le même ensemble de contrôles que vous utiliserez sur cette fenêtre, vous utiliserez également sur une autre, donc au lieu d'écrire du double code, créez simplement un UserControl, mais sinon, mettez simplement des contrôles pour la visualisation de vos données sur elles- Windowmêmes, sur le côté droit des boutons que vous avez mentionnés.
Tigran
6
Il y a un autre élément que je pense , il faut ajouter: DataTemplates. Ils sont utilisés lorsque vous souhaitez indiquer à WPF comment dessiner un élément dans une portée spécifique. Par exemple, si vous souhaitez dessiner vos Buttonscercles ronds, vous pouvez simplement utiliser a DataTemplateau lieu de a UserControl. J'utilise généralement UserControlsquand je veux un nouveau contrôle avec ses propres fonctionnalités, ou quand j'ai beaucoup de XAML pour un seul composant, comme pour un View. Pour les petits morceaux de XAML qui ne nécessitent aucune fonctionnalité spéciale, vous devriez utiliser un DataTemplateau lieu de créer unUserControl
Rachel
3
En général, le contenu de a Pagen'est pas HTML mais XAML. Cependant, a Pageest lié au cadre de navigation qui est conceptuellement similaire à la façon dont la navigation est effectuée dans un navigateur Web. (Et les pages peuvent même être hébergées dans un navigateur si l'application est une application XBAP.)
Martin Liversage
6

Tout dépend de l'application que vous essayez de créer. Utilisez Windows si vous créez une application basée sur une boîte de dialogue. Utilisez Pages si vous créez une application basée sur la navigation . UserControls seront utiles quelle que soit la direction dans laquelle vous allez car vous pouvez les utiliser à la fois dans Windows et dans Pages.

Un bon endroit pour commencer à explorer est ici: http://windowsclient.net/learn

sellmeadog
la source
5

Nous utilisons généralement One Main Windowpour l'application et d'autres fenêtres peuvent être utilisées dans des situations telles que lorsque vous avez besoin de fenêtres contextuelles, car au lieu d'utiliser des contrôles contextuels en XAML qui ne sont pas visibles, nous pouvons utiliser une fenêtre visible au moment du design, ce qui sera facile. travailler avec

D'autre part, nous utilisons de nombreuses pages pour naviguer d'un écran à un autre, comme l'écran de gestion des utilisateurs à l'écran de commande, etc.Dans la fenêtre principale, nous pouvons utiliser le Framecontrôle pour la navigation comme ci-dessous XAML

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

C'est une façon de le faire. Nous pouvons également utiliser un contrôle de tabulation au lieu de Fram et y ajouter des pages à l'aide d'un dictionnaire tout en ajoutant une nouvelle page pour vérifier si le contrôle existe déjà, puis uniquement naviguer, ajouter et naviguer. J'espère que ça aidera quelqu'un

dnxit
la source