2017-02-20 4 views
1

Je viens d'un environnement Windows Forms et je suis un peu confus sur ce qui serait considéré comme la meilleure pratique pour contrôler l'affichage d'un contrôle. Je travaille sur un Control que je veux un peu "Eye Candy". Dans WinForms je remplacerais l'événement Paint pour faire n'importe quel type de programmation visuelle. Je comprends que la principale raison pour laquelle WPF a été conçu est de séparer l'action de l'affichage.Modèles de contrôle personnalisés, affichage et WPF

Voici la partie dont je ne suis pas sûr. Dites que je veux dessiner quelques lignes simples dans le "Background" du contrôle. Serait-ce une bonne pratique d'ajouter les lignes dans le modèle ou de faire le dessin des lignes dans le code derrière comme je le ferais dans WinForms?

Par exemple dire que je développe un contrôle nommé CustomControl1 et que vous souhaitez tracer une ligne sur toute la largeur du contrôle qui est centré verticalement comme:

CustomControl1

Serait-il préférable de faire la ligne le code derrière ou dans le modèle?

je peux le faire tout en XAML comme ceci:

<Style TargetType="{x:Type local:CustomControl1}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:CustomControl1}"> 
        <Border Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 

         <Grid HorizontalAlignment="Left" Width="{Binding ActualWidth}"> 

          <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Aqua"> 
           <Path Stretch="Fill" Stroke="Black" StrokeThickness="1" Data="M 0,0.5 H 1" /> 
          </Border> 

          <TextBlock 
            HorizontalAlignment="Center" 
            Text="Some Text" /> 
         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Je ne sais pas si cela est la « meilleure pratique » ou s'il y a une autre façon que je devrais utiliser tous ensemble? Y a-t-il une raison pour utiliser l'un plutôt que l'autre? Y a-t-il des gains/pertes de performance?

+1

La structure visuelle d'un contrôle WPF est généralement définie par sa propriété Template, qui est définie dans un style (par défaut). Voir par exemple les sections * Notes * et * Examples * sur la page [ControlTemplate] (https://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate (v = vs.110) .aspx) sur MSDN. La section * Control Templates * de la page [Styling and Templating] (https://msdn.microsoft.com/fr-fr/library/ms745683 (v = vs.110) .aspx) peut également vous être utile. – Clemens

Répondre

0

Tout ce qui est statique devrait être dans le xaml. Par exemple, si vous savez que cette ligne commencera toujours à cette position, avec cette taille, mettez-la dans le xaml. Mais si la ligne est dynamique, comme si vous pouviez avoir une ou plusieurs lignes, avec des angles, des courbes, des couleurs différentes ect ... Vous voudrez peut-être l'initialiser vous-même et définir les propriétés dans votre contrôle utilisateur.

0

IMO, votre code va bien. Personne ne ferait jamais "faire le dessin des lignes dans le code derrière comme je le ferais dans WinForms" pour ce genre d'exigences dans WPF.

Le contrôle de l'affichage du contrôle à l'aide de ControlTemplate et de Style est l'approche recommandée dans WPF. En outre, si vous avez besoin du contrôle dans le code, vous pouvez obtenir les contrôles définis dans ControlTemplate en utilisant la méthode GetTemplateChild à l'intérieur du contrôle OnApplyTemplate de votre contrôle personnalisé.