204 votes

Fenêtre vs Page vs UserControl pour la navigation WPF ?

Je suis en train d'écrire une application de bureau, mais je n'arrive pas à comprendre ce qu'il faut utiliser pour rediriger quelqu'un vers une nouvelle section de l'application.

Mes options semblent être

  • Fenêtre
  • Page
  • Contrôle de l'utilisateur

mais je ne comprends pas quelle est la différence entre eux, et quand je dois utiliser chacun d'eux.

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

361voto

Rachel Points 49408

A Fenêtre est exactement ce qu'il semble être : c'est un nouveau Window pour votre application. Vous devriez l'utiliser lorsque vous voulez faire apparaître une toute nouvelle fenêtre. Je n'utilise pas souvent plus d'une Window en WPF parce que je préfère mettre dans ma fenêtre principale un contenu dynamique qui change en fonction des actions de l'utilisateur.

A Page est une page à l'intérieur de votre fenêtre. Il est surtout utilisé pour les systèmes basés sur le web comme un 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 Applications de navigation comme sellmeadog a dit .

A Contrôle de l'utilisateur est un contrôle réutilisable créé par l'utilisateur que vous pouvez ajouter à votre interface utilisateur de la même manière que tout autre contrôle. En général, je crée un UserControl lorsque je souhaite intégrer une fonctionnalité personnalisée (par exemple, une CalendarControl ), ou lorsque j'ai une grande quantité de code XAML connexe, comme une View lorsqu'on utilise le modèle de conception MVVM.

Lorsque vous naviguez entre les fenêtres, vous pouvez simplement créer une nouvelle fenêtre. Window et le montrer

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 Windows si possible.

La méthode de navigation que je préfère consiste à créer une zone de contenu dynamique à l'aide d'une balise ContentControl et de le remplir avec un UserControl contenant ce que la vue actuelle est.

<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 une très exemple de base sur mon blog qui illustre la façon dont on navigue avec 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>

Screenshot1Screenshot2

0 votes

J'ai une question. D'après ce que je peux voir, MVVM semble bien fonctionner avec les ensembles de données, mais qu'en est-il des formulaires statiques comme par exemple un formulaire de saisie pour un audit. Devrais-je utiliser une page ou un usercontrol pour les pages statiques ?

2 votes

@Herrozerro Si je voulais créer un formulaire d'audit en utilisant MVVM, j'aurais une AuditViewModel contenant toutes les données et les fonctionnalités du formulaire, et je le dessinerais en utilisant soit un fichier AuditView UserControl, ou simplement un DataTemplate

1 votes

Merci ! En fait, après avoir parcouru votre blog et quelques autres sites, je comprends mieux le fonctionnement de MVVM.

13voto

Tigran Points 41381
  • Fenêtre c'est comme Windows.Forms.Form donc juste une nouvelle fenêtre

  • Page est, selon documentation en ligne :

    Encapsule une page de contenu vers laquelle on peut naviguer et hébergée par Windows Internet Explorer, NavigationWindow et Frame.

    Donc vous utilisez ceci si vous visualisez du contenu HTML.

  • Contrôle de l'utilisateur est destiné aux cas où vous souhaitez créer un composant réutilisable (mais pas autonome) pour l'utiliser dans plusieurs applications différentes. Windows

0 votes

Merci pour votre réponse. Donc, par exemple, si vous créez une application avec des boutons sur la gauche et que vous voulez voir le contenu de ces boutons sur la droite, vous utiliserez un contrôle utilisateur ?

0 votes

@Steve : utiliser UserControl dans le cas où vous pensez que le même ensemble de contrôles que vous allez utiliser sur cette fenêtre, vous l'utiliserez aussi sur une autre, donc au lieu d'écrire un double code, créez simplement un fichier UserControl mais si ce n'est pas le cas, il suffit de mettre des contrôles pour la visualisation de vos données sur le site web de l'entreprise. Window lui-même, à droite des boutons que vous avez mentionnés.

6 votes

Il y a un autre élément qui, selon moi, devrait être ajouté : DataTemplates . Ils sont utilisés lorsque vous souhaitez indiquer à WPF comment dessiner un élément dans un cadre spécifique. Par exemple, si vous voulez dessiner votre Buttons pour être des cercles ronds, vous pourriez simplement utiliser un DataTemplate au lieu d'un UserControl . J'utilise généralement UserControls lorsque je veux un nouveau contrôle avec sa propre fonctionnalité, ou lorsque j'ai beaucoup de XAML pour un seul composant, comme pour une View . Pour les petits bouts de XAML qui ne nécessitent pas de fonctionnalité particulière, vous devez utiliser une balise DataTemplate au lieu de créer un UserControl

6voto

sellmeadog Points 3431

Tout dépend de l'application que vous essayez de créer. Utilisez Window si vous construisez une application basée sur le dialogue. Utilisez Page si vous construisez un application basée sur la navigation . UserControl vous seront utiles quelle que soit la direction que vous prenez, car vous pouvez les utiliser à la fois dans Windows et dans Pages.

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

5voto

Lucky Points 316

Nous utilisons généralement One Main Window pour l'application et d'autres fenêtres peuvent être utilisées dans des situations comme lorsque vous avez besoin de fenêtres contextuelles, car au lieu d'utiliser des contrôles de fenêtres contextuelles dans le XAML qui ne sont pas visibles, nous pouvons utiliser une fenêtre qui est visible au moment de la conception et qui sera facile à utiliser.

D'autre part, nous utilisons de nombreuses pages pour naviguer d'un écran à l'autre, par exemple l'écran de gestion des utilisateurs à l'écran des commandes, etc. Frame 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");
        }
    }

Nous pouvons également utiliser un contrôle d'onglet au lieu d'un cadre et y ajouter des pages en utilisant un dictionnaire. Lors de l'ajout d'une nouvelle page, il faut vérifier si le contrôle existe déjà, puis seulement naviguer, sinon ajouter et naviguer. J'espère que cela aidera quelqu'un

2voto

Hitesh Mistry Points 618

La plupart d'entre eux ont affiché la bonne réponse. Je voudrais ajouter quelques liens, afin que vous puissiez vous y référer et avoir des idées claires et meilleures sur le sujet :

Contrôle de l'utilisateur : http://msdn.microsoft.com/en-IN/library/a6h7e207(v=vs.71).aspx

La différence entre page et fenêtre dans le cadre de WPF : Page ou fenêtre dans WPF ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X