it-swarm.com.de

Unterschied zwischen Style und ControlTemplate

Könnten Sie mir sagen, was ist der Hauptunterschied zwischen Style und ControlTemplate? Wann oder warum sollten Sie das eine oder das andere verwenden?

Für meine Augen sind es genau die selben. Als Anfänger denke ich, dass ich falsch liege, also meine Frage.

51

In einem Stil legen Sie Eigenschaften eines Steuerelements fest.

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Red"/>
</Style>

<Button Style="{StaticResource MyButtonStyle}"/>

Für alle Schaltflächen, die diesen Stil verwenden, ist der Hintergrund auf Rot gesetzt.

In einer Vorlage definieren Sie die UI (Struktur) des Controls.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="Green"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

<Button Template="{StaticResource MyButtonTemplate}"/>

Alle Schaltflächen, die diese Vorlage verwenden, haben einen grünen Hintergrund, der nicht geändert werden kann.

In einer template gesetzte Werte können nur ersetzt werden, indem die gesamte Vorlage ersetzt wird. Werte in einem style können ersetzt werden, indem der Wert bei Verwendung des Steuerelements explizit festgelegt wird. Deshalb ist es besser, die Eigenschaften des Steuerelements zu verwenden, indem TemplateBinding verwendet wird, anstatt Werte zu codieren.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="{TemplateBinding Background}"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

Jetzt verwendet die Vorlage den Wert der Background-Eigenschaft der Schaltfläche, auf die sie angewendet wird, sodass sie angepasst werden kann:

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>

Eine weitere nützliche Funktion besteht darin, dass Steuerelemente einen Standardstil übernehmen können, ohne dass ein bestimmter Stil zugewiesen wird. Mit einer Vorlage ist das nicht möglich.

Entfernen Sie einfach das x: Key-Attribut des Stils (erneut: Sie können dies nicht mit Vorlagen tun). Für alle Schaltflächen in der visuellen Struktur unter dem Stil wird dieser Stil angewendet.

Das Kombinieren von Vorlagen und Stilen ist besonders leistungsstark: Sie können die Vorlageneigenschaft im Stil festlegen:

<Style TargetType="Button">
    <Setter Property="Background" Value="Red"/>
    <Setter Property="Template">
        <Setter.Value>
             <ControlTemplate TargetType="Button">
                 <Grid>
                     <Rectangle Fill="{TemplateBinding Background"/>
                     <ContentPresenter/>
                 </Grid>
             </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
68
Erno de Weerd

Nein, du liegst falsch. Styles setzen Eigenschaften für Steuerelemente. ControlTemplate ist eine Eigenschaft, die von den meisten Steuerelementen verwendet wird, die angeben, wie sie gerendert werden.

Sie können einen Stil verwenden, um Einstellungen für eine Reihe von Eigenschaften zu gruppieren, damit Sie ihn zur Standardisierung Ihrer Steuerelemente wiederverwenden können. Stile können explizit für Steuerelemente festgelegt oder auf alle einen bestimmten Typ angewendet werden.

Steuerelementvorlagen können durch einen Stil oder explizit für ein Steuerelement festgelegt werden, um die Darstellung zu ändern. Alle Steuerelemente verfügen über Standardvorlagen (und Stile für diese Angelegenheit), die in die .net wpf-Assemblys eingebettet sind. Es ist ziemlich aufschlussreich, diese zu sehen und zu verstehen, wie die wpf-Entwickler die normalen Versionen aller Steuerelemente implementiert haben. Wenn Sie Expression Blend installiert haben, schauen Sie in den Ordner "SystemThemes".

UPDATE:

Um zu verstehen, wie Styles und ControlTemplates Steuerelemente hinzufügen können. In irgendeiner Weise ist das ControlTemplate die einzige Möglichkeit, die Steuerelemente zu definieren, aus denen ein Steuerelement aus besteht. Bei einigen Standard-.NET-Steuerelementen können Sie jedoch anstelle von Text Steuerelemente verwenden. 

Zum Beispiel:

<GroupBox>
  <GroupBox.Header>
    <CheckBox/>
  </GroupBox.Header>
</GroupBox>

Dadurch wird der Gruppenbox ein Kontrollkästchen "hinzugefügt", ohne ControlTemplate zu ändern. Dies liegt jedoch daran, dass die Standardeinstellung ControlTemplate für GroupBox alles als Header zulässt. Dies geschieht mit speziellen Steuerelementen wie ContentPresenter.

In einigen Fällen können Sie jedoch mit der Standardsteuerelementvorlage für ein Steuerelement nicht etwas ändern, das Sie über Eigenschaften ändern möchten. Dann müssen Sie die ControlTemplate ändern.

Unabhängig davon, ob Sie die Eigenschaften eines Steuerelements (Inhalt, Header, ControlTemplate, IsEnabled usw.) direkt oder über einen Stil festlegen, sind Stile nur eine Annehmlichkeit.

Hoffentlich beantwortet das Ihre Frage klarer.

23
Andre Luus

Sie können sich einen Style als bequeme Methode vorstellen, um einen Satz von Eigenschaftswerten auf mehrere Elemente anzuwenden. Sie können die Standarddarstellung ändern, indem Sie Eigenschaften wie FontSize und FontFamily für jedes TextBlock-Element direkt festlegen. Wenn Sie jedoch möchten, dass Ihre TextBlock-Elemente einige Eigenschaften gemeinsam nutzen, können Sie im Abschnitt Resources Ihrer XAML-Datei einen Style erstellen.

Auf der anderen Seite gibt ein ControlTemplate die visuelle Struktur und das visuelle Verhalten eines Steuerelements an. Sie können das Erscheinungsbild eines Steuerelements anpassen, indem Sie ihm eine neue Steuerelementvorlage zuweisen. Wenn Sie eine ControlTemplate erstellen, ersetzen Sie das Erscheinungsbild eines vorhandenen Steuerelements, ohne dessen Funktionalität zu ändern. Beispielsweise können Sie die Schaltflächen in Ihrer Anwendung anstelle der viereckigen Standardform rund machen. Die Schaltfläche löst jedoch immer noch das Click-Ereignis aus.

Ref: http://msdn.Microsoft.com/en-us/library/ms745683.aspx

13
Teoman Soygul

Ich fand einige interessante Unterschiede in Der Unterschied zwischen Stilen und Vorlagen (msdn)

Stil: Sie können nur bereits vorhandene Eigenschaften im Stil festlegen. Sie können beispielsweise keinen Standardwert für eine Eigenschaft festlegen, die zu einem neuen Teil gehört, den Sie der Vorlage hinzugefügt haben.

Vorlage: Wenn Sie eine Vorlage ändern, ist Sie haben Zugriff auf mehr Teile eines Steuerelements als beim Ändern eines Stils. Sie können beispielsweise die Art und Weise ändern, in der die Popup-Liste in einem Kombinationsfeld angezeigt wird, oder Sie ändern das Aussehen der Schaltfläche, die die Popup-Liste im Kombinationsfeld auslöst, indem Sie die Elementvorlage ändern.


Style: Sie können Stile verwenden, um das Standardverhalten eines Steuerelements anzugeben. In einem Stil für eine Schaltfläche können Sie beispielsweise einen Auslöser angeben, sodass sich die Hintergrundfarbe ändert, wenn Benutzer den Mauszeiger über die Schaltfläche bewegen. Diese Eigenschaftsänderungen sind sofort (sie sind können nicht schrittweise animiert werden).

Template: Sie können das Verhalten aller neuen und vorhandenen Teile in einer Vorlage mithilfe von Auslösern angeben. Sie können beispielsweise einen Auslöser angeben, sodass sich die Farbe eines der Teile ändert, wenn Benutzer den Mauszeiger über eine Schaltfläche bewegen. Diese Eigenschaftsänderungen können sofort erfolgen oder allmählich animiert, um einen glatten Übergang zu erzeugen.

2
Bakri Bitar

OK, ich hatte genau die gleiche Frage und die Antworten, die ich in diesem Thread gefunden hatte, wiesen mich in die richtige Richtung, also teile ich sie, wenn auch nur, damit ich sie selbst besser verstehen kann.

Ein Style ist flexibler als eine ControlTemplate.

Von Windows Presentation Foundation Unleashed , geben Adam Nathan und Gang (Schriftsteller) Folgendes an:

  • "Neben der Bequemlichkeit, eine Vorlage [mit einem Style mit dem ControlTemplate-Setter des Styles] mit beliebigen Eigenschaftseinstellungen zu kombinieren, gibt es wichtige Vorteile, wenn Sie dies tun [den ControlTemplate-Setter auf einen Style setzen]:

    1. Es gibt Ihnen die Wirkung von Standardvorlagen. Wenn beispielsweise ein typisierter Stil standardmäßig auf Elemente angewendet wird und dieser Stil eine benutzerdefinierte Steuerelementvorlage enthält, wird die Steuerelementvorlage ohne explizite Markierungen auf diesen Elementen angewendet.
    2. Hiermit können Sie standardmäßige, aber überschreibbare Eigenschaftswerte bereitstellen, die das Aussehen der Vorlage steuern. Mit anderen Worten, Sie können damit die Eigenschaften der übergeordneten Vorlagen eines Elternteils respektieren und trotzdem Ihre eigenen Standardwerte angeben. "

Mit anderen Worten: Durch die Erstellung eines Stils kann der Benutzer des Template-Setters des Styles den eingestellten Wert überschreiben, auch wenn er keine TemplateBinding verwendet hat (beispielsweise {TemplateBinding Width}). Wenn Sie die Width in Ihrem Style fest codiert haben, könnte der Benutzer des Styles ihn trotzdem überschreiben. Wenn Sie jedoch die Width-Eigenschaft in einer Vorlage hardcodiert haben, bleibt der Benutzer dabei.

Außerdem (und das ist irgendwie verwirrend), wenn ein ContentTemplate mit einem TemplateBinding verwendet wird, muss der Benutzer diese Eigenschaft festlegen. Andernfalls wird die Standardeigenschaft für TargetType verwendet. Wenn Sie einen Stil verwenden, können Sie die Standardeigenschaft von TargetType überschreiben, indem Sie einen Setter für die Eigenschaft verwenden und dann eine TemplateBinding-Referenz auf diesen Setter anwenden. Das Buch erklärt es besser, Seite 338 (Mischen von Vorlagen mit Stilen)

0
John C