2017-02-20 3 views
1

Ich komme aus einem Windows Forms-Hintergrund und bin ein wenig verwirrt darüber, was als die beste Vorgehensweise zur Steuerung der Anzeige eines Steuerelements angesehen wird. Ich arbeite an einem Control, an dem ich etwas "Eye Candy" haben möchte. In WinForms würde ich das Paint-Ereignis überschreiben, um jede Art von visueller Programmierung durchzuführen. Ich verstehe, dass der Hauptgrund, warum WPF konzipiert wurde, darin besteht, die Aktion von der Anzeige zu trennen.Benutzerdefinierte Steuerungsvorlagen, Anzeige und WPF

Hier ist der Teil, über den ich mich nicht sicher bin. Angenommen, ich möchte einige einfache Linien im "Hintergrund" des Controls zeichnen. Wäre es als beste Vorgehensweise anzusehen, die Zeilen in das Template einzufügen oder die Zeichnung der Zeilen im Code dahinter auszuführen, so wie ich es in WinForms machen würde?

Für Beispiel sagen, dass ich eine Kontrolle entwickle CustomControl1 benannt und will eine Linie, die die gesamte Breite der Steuerung zu ziehen, die vertikal wie zentriert ist:

CustomControl1

Wäre es besser, die Linie zu tun in der Code hinter oder in der Vorlage?

ich kann es ganz in XAML wie so:

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

Ich bin nicht sicher, ob dies das „Best Practice“ ist oder ob es eine andere Art und Weise, die ich alle zusammen verwenden sollte? Gibt es einen Grund, einen über den anderen zu benutzen? Gibt es Leistungsgewinne/-verluste?

+1

Die visuelle Struktur eines WPF-Steuerelements wird normalerweise durch seine Template-Eigenschaft definiert, die in einem (Standard) -Stil festgelegt wird. Siehe z.B. Die Abschnitte * Bemerkungen * und * Beispiele * auf der Seite [ControlTemplate] (https://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate (v = vs.110) .aspx) MSDN. Der Abschnitt * Control Templates * auf der Seite [Styling und Templating] (https://msdn.microsoft.com/en-us/library/ms745683 (v = vs.110) .aspx) kann ebenfalls hilfreich sein. – Clemens

Antwort

0

Alles statische sollte in der XAML sein. Wenn Sie beispielsweise wissen, dass diese Zeile immer an dieser Position beginnt, fügen Sie sie mit dieser Größe in die XAML ein. Aber wenn die Linie dynamisch ist, wie Sie können eine oder viele Linien haben, mit Winkeln, Kurven, verschiedenen Farben ect ... Vielleicht möchten Sie es selbst initialisieren und Eigenschaften in Ihrem Benutzer Steuerelement festlegen.

0

IMO, Ihr Code ist in Ordnung. Niemand würde jemals "das Zeichnen der Zeilen im Code dahinter machen, wie ich es in WinForms tun würde" für diese Art von Anforderungen in WPF.

Die Steuerung der Anzeige mit ControlTemplate und Style ist der beste und empfohlene Ansatz in WPF. Wenn Sie die Steuerelemente in Code benötigen, können Sie außerdem die in ControlTemplate definierten Steuerelemente mithilfe der GetTemplateChild-Methode innerhalb der OnApplyTemplate-Überschreibung des benutzerdefinierten Steuerelements abrufen.

Verwandte Themen