web-dev-qa-db-fra.com

Window vs Page vs UserControl pour la navigation WPF?

J'écris actuellement 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
  • UserControl

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

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

181
Steve

Un objet Window correspond à ce que cela ressemble à: c'est un nouveau Window pour votre application. Vous devriez l'utiliser quand vous voulez faire apparaître une nouvelle fenêtre. Je n'utilise pas souvent plus d'un Window dans WPF car je préfère insérer dans ma fenêtre principale un contenu dynamique qui change en fonction de l'action de l'utilisateur.

Une page Page est une page située dans votre fenêtre. Il est principalement utilisé pour les systèmes Web, tels que XBAP, dans lesquels vous n’avez qu’une seule fenêtre de navigateur et où différentes pages peuvent être hébergées. Il peut également être utilisé dans applications de navigation comme 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 un autre contrôle. En général, je crée un UserControl lorsque je souhaite intégrer des fonctionnalités personnalisées (par exemple, un CalendarControl) ou lorsque je dispose d'une grande quantité de code XAML associé, tel qu'un View lorsque j'utilise le modèle de conception MVVM.

Lorsque vous naviguez entre les fenêtres, vous pouvez simplement créer un nouvel objet Window 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 ContentControl et à la renseigner avec un UserControl contenant 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 à l'aide de

ContentArea.Content = new MyUserControl();

Mais si vous travaillez avec WPF, je vous recommande fortement le modèle de conception MVVM. J'ai un très exemple de base sur mon blog qui illustre comment vous allez naviguer à l'aide de 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

320
Rachel
  • La fenêtre est comme Windows.Forms.Form, donc juste une nouvelle fenêtre
  • La page est, selon documentation en ligne :

    Encapsule une page de contenu sur laquelle il est possible de naviguer et d’être 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) afin de l'utiliser dans plusieurs Windows différents

13
Tigran

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

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

5
sellmeadog

Nous utilisons généralement une fenêtre principale pour 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 dans XAML qui ne sont pas visibles, nous pouvons utiliser une fenêtre visible au moment de la conception. facile de travailler avec

d'autre part, nous utilisons plusieurs pages pour naviguer d'un écran à l'autre, comme l'écran de gestion des utilisateurs vers l'écran de commande, etc. Dans la fenêtre principale, nous pouvons utiliser le contrôle Fram 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 d'onglet au lieu de Fram et lui ajouter des pages à l'aide d'un dictionnaire tout en ajoutant une nouvelle page pour vérifier si le contrôle existe déjà, alors naviguez uniquement, sinon ajoutez et naviguez. J'espère que ça va aider quelqu'un

3
dnxit

Surtout a posté une réponse correcte. Je voudrais ajouter quelques liens, afin que vous puissiez vous y référer et avoir des idées claires et meilleures à propos de la même chose:

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

La différence entre page et fenêtre par rapport à WPF: Page vs Window dans WPF?

2
Hitesh