Unterschied zwischen Style und ControlTemplate

69

Können Sie mir sagen, was die Hauptunterschiede zwischen Style und ControlTemplate sind? Wann oder warum das eine oder andere verwenden?

Für meine Augen sind sie genau gleich . Als Anfänger denke ich, dass ich falsch liege, daher meine Frage.

Stephane Rolland
quelle
1
Siehe auch
Helen
3
MSDN-Ressource, Der Unterschied zwischen Stilen und Vorlagen: msdn.microsoft.com/en-us/library/…
Stephane Rolland

Antworten:

14

Sie können sich einen Stil als eine bequeme Möglichkeit vorstellen, eine Reihe von Eigenschaftswerten auf mehr als ein Element 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 Ressourcen Ihrer XAML-Datei einen Stil erstellen.

Andererseits gibt eine ControlTemplate die visuelle Struktur und das visuelle Verhalten eines Steuerelements an. Sie können das Erscheinungsbild eines Steuerelements anpassen, indem Sie ihm eine neue ControlTemplate geben. Wenn Sie eine ControlTemplate erstellen, ersetzen Sie das Erscheinungsbild eines vorhandenen Steuerelements, ohne dessen Funktionalität zu ändern. Sie können beispielsweise die Schaltflächen in Ihrer Anwendung anstelle der quadratischen Standardform runden, die Schaltfläche löst jedoch weiterhin das Click-Ereignis aus.

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

Teoman Soygul
quelle
79

In einem Stil legen Sie die Eigenschaften eines Steuerelements fest.

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

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

Bei allen Schaltflächen, die diesen Stil verwenden, wird der Hintergrund auf Rot gesetzt.

In einer Vorlage definieren Sie die Benutzeroberfläche (Struktur) des Steuerelements.

<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 Vorlage festgelegte Werte können nur durch Ersetzen der gesamten Vorlage ersetzt werden. Werte in einem Stil können ersetzt werden, indem der Wert bei Verwendung des Steuerelements explizit festgelegt wird. Aus diesem Grund ist es besser, die Eigenschaften des Steuerelements mithilfe von TemplateBinding zu verwenden, 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 ihnen ein bestimmter Stil zugewiesen wird. Mit einer Vorlage ist das nicht möglich.

Entfernen Sie einfach das x: Key-Attribut des Stils (wieder: Sie können dies nicht mit Vorlagen tun). Auf alle Schaltflächen im visuellen Baum unter dem Stil wird dieser Stil angewendet.

Das Kombinieren von Vorlagen und Stilen ist besonders leistungsfähig: Sie können die Template-Eigenschaft im folgenden 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>
Erno
quelle
4
Ihr Beispiel passt also genau zu der Frage, über die ich mich wundere ... Was ist der Unterschied zwischen einer Steuerelementvorlage und einem Stil, der NUR eine Steuerelementvorlage definiert? Ist es üblich, Controltemplate immer nach Styles zu kapseln?
Stephane Rolland
23

Nein, in der Tat, du liegst ganz falsch. Stile legen Eigenschaften für Steuerelemente fest. ControlTemplate ist eine Eigenschaft, die von den meisten Steuerelementen gemeinsam genutzt wird und angibt, wie sie gerendert werden.

Um dies zu erläutern, können Sie einen Stil verwenden, um Einstellungen für eine Reihe von Eigenschaften zu gruppieren, damit Sie diese wieder verwenden können, um Ihre Steuerelemente zu standardisieren. Stile können explizit auf Steuerelemente festgelegt oder auch auf alle eines bestimmten Typs 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), 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".

AKTUALISIEREN:

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

Zum Beispiel:

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

Dies "fügt" dem Gruppenfeld ein Kontrollkästchen hinzu, ohne das zu ändern. ControlTemplateDies liegt jedoch daran, dass die Standardeinstellung ControlTemplatefür " GroupBoxAlles" als Kopfzeile zulässt . Dies geschieht mit speziellen Steuerelementen wie z ContentPresenter.

Manchmal können Sie mit der Standard-ControlTemplate für ein Steuerelement jedoch nichts ändern, was Sie über Eigenschaften ändern möchten. Dann müssen Sie die ControlTemplate ändern.

Es spielt keine Rolle, ob Sie die Eigenschaften eines Steuerelements (Inhalt, Kopfzeile, ControlTemplate, IsEnabled usw.) direkt oder über einen Stil festlegen. Stile sind nur eine Annehmlichkeit.

Hoffentlich beantwortet dies Ihre Frage klarer.

Andre Luus
quelle
1
Okay, aber in dem Projekt, für das ich arbeite, wurden beide verwendet, um einigen Steuerelementen andere Steuerelemente hinzuzufügen ... und auch um Eigenschaften festzulegen ... also sehe ich keinen Unterschied in ihrer Verwendung? ? ?
Stephane Rolland
2

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

Stil: Sie können nur bereits vorhandene Eigenschaften im Stil festlegen . Beispielsweise können Sie 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, haben Sie Zugriff auf mehr Teile eines Steuerelements als beim Ändern eines Stils. Sie können beispielsweise die Darstellung der Popup-Liste in einem Kombinationsfeld ändern oder das Aussehen der Schaltfläche ändern, die die Popup-Liste im Kombinationsfeld auslöst, indem Sie die Elementvorlage ändern.


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

Vorlage: Sie können das Verhalten neuer und vorhandener Teile in einer Vorlage mithilfe von Triggern festlegen. Sie können beispielsweise einen Auslöser angeben, damit sich die Farbe eines der Teile ändert, wenn Benutzer ihren Mauszeiger über eine Schaltfläche bewegen. Diese Eigenschaftsänderungen können sofort oder schrittweise animiert werden , um einen reibungslosen Übergang zu erzielen.

Bakri Bitar
quelle
0

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

Ein Stil ist flexibler als eine ControlTemplate.

Adam Nathan und Gang (Autoren) von der Windows Presentation Foundation Unleashed geben Folgendes an:

  • "Neben der Bequemlichkeit, eine Vorlage [mit einem Stil unter Verwendung des ControlTemplate-Setters des Stils] mit beliebigen Eigenschafteneinstellungen zu kombinieren, bietet dies wichtige Vorteile [Festlegen des ControlTemplate-Setters für einen Stil]:

    1. Sie erhalten den Effekt von Standardvorlagen. Wenn beispielsweise ein typisierter Stil standardmäßig auf Elemente angewendet wird und dieser Stil eine benutzerdefinierte Steuerungsvorlage enthält, wird die Steuerungsvorlage ohne explizite Markierungen auf diese Elemente angewendet.
    2. Hiermit können Sie einen Standardwert für die überschreibbare Eigenschaft bereitstellen, der das Erscheinungsbild der Vorlage steuert. Mit anderen Worten, Sie können die Eigenschaften des übergeordneten Elements berücksichtigen und dennoch Ihre eigenen Standardwerte angeben. "

Mit anderen Worten, das Erstellen eines Stils ermöglicht es dem Benutzer des Template-Setters des Stils, die festgelegten Werte zu überschreiben, selbst wenn er keine TemplateBinding (z. B. {TemplateBinding Width}) verwendet hat. Wenn Sie die Breite in Ihrem Stil fest codiert haben, kann der Benutzer des Stils sie dennoch überschreiben. Wenn Sie diese Width-Eigenschaft in einer Vorlage fest codiert haben, bleibt der Benutzer dabei.

Wenn Sie eine ContentTemplate mit einer TemplateBinding verwenden (und dies ist etwas verwirrend), muss der Benutzer diese Eigenschaft festlegen. Andernfalls wird die Standardeigenschaft für den TargetType verwendet. Wenn Sie einen Stil verwenden, können Sie die Standardeigenschaft des TargetType überschreiben, indem Sie einen Setter für die Eigenschaft verwenden und dann eine TemplateBinding-Referenzierung auf diesen Setter anwenden. Das Buch erklärt es besser, Seite 338 (Mischen von Vorlagen mit Stilen)

John C.
quelle