Freigeben über


Style Klasse

Definition

Enthält Eigenschaftssetter, die zwischen Instanzen eines Typs freigegeben werden können. Eine Formatvorlage wird normalerweise in einer Ressourcensammlung deklariert, sodass sie freigegeben und zum Anwenden von Steuerelementvorlagen und anderen Formatvorlagen verwendet werden kann.

public ref class Style sealed : DependencyObject
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
class Style final : DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, "Windows.Foundation.UniversalApiContract")]
class Style final : DependencyObject
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
public sealed class Style : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, "Windows.Foundation.UniversalApiContract")]
public sealed class Style : DependencyObject
Public NotInheritable Class Style
Inherits DependencyObject
<Style .../>
-or-
<Style ...>
  oneOrMoreSetters
</Style>
Vererbung
Object Platform::Object IInspectable DependencyObject Style
Attribute

Windows-Anforderungen

Gerätefamilie
Windows 10 (eingeführt in 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (eingeführt in v1.0)

Beispiele

In diesem Beispiel werden zwei Stile erstellt: eine für einen TextBlock und eine für ein TextBox-Objekt. Jede Formatvorlage wird auf zwei Instanzen eines Steuerelements angewendet, um eine einheitliche Darstellung für jeden TextBlock und TextBox zu erstellen. Im Beispiel wird die FrameworkElement.Style-Eigenschaft jedes Steuerelements festgelegt, indem auf style als {StaticResource}-Markuperweiterung verwiesen wird. Das Beispiel zeigt auch, wie Ein Stil aus einem Ressourcenwörterbuch abgerufen und auf ein Steuerelement im Code angewendet wird.

Jede Formatvorlage verfügt über mehrere Setter-Teile . In diesem XAML-Code wird kein Style.Setters XAML-Eigenschaftselement angezeigt. Dies ist die typische Verwendung in XAML für diese Eigenschaft. Der Style.Setters Wert ist implizit, da Setters die XAML-Inhaltseigenschaft für einen Style ist. Weitere Informationen zur XAML-Syntax und dazu, wie die XAML-Inhaltssyntax das Implizieren und Weglassen bestimmter XAML-Elemente ermöglicht, finden Sie im XAML-Syntaxleitfaden.

Beachten Sie, dass in der Formatvorlage für textBox die Margin-Eigenschaft auf 4 festgelegt ist, was bedeutet, dass das TextBox-Objekt auf allen Seiten einen Rand von 4 aufweist. Um die Länge des zweiten TextBlocks auszugleichen, der kürzer als der erste TextBlock ist, da Nachname weniger Platz als Vorname einnimmt, wird der Margin-Eigenschaft im zweiten TextBox-Objekt der Wert "6,4,4,4" zugewiesen. Dies führt dazu, dass das zweite TextBox-Objekt einen anderen Rand aufweist, als im Stil angegeben, sodass es horizontal am ersten TextBox-Element ausgerichtet wird.

<StackPanel x:Name="rootPanel">
  <StackPanel.Resources>
    <!--Create a Style for a TextBlock to specify that the
              Foreground equals Navy, FontSize equals 14, and
              VerticalAlignment equals Botton.-->
    <Style TargetType="TextBlock" x:Key="TextBlockStyle">
      <Setter Property="Foreground" Value="Navy"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="VerticalAlignment" Value="Bottom"/>
    </Style>

    <!--Create a Style for a TextBox that specifies that
              the Width is 200, Height is 30, Margin is 4,
              Background is LightBlue, and FontSize is 14.-->
    <Style TargetType="TextBox" x:Key="TextBoxStyle">
      <Setter Property="Width" Value="200"/>
      <Setter Property="Height" Value="30"/>
      <Setter Property="Margin" Value="4"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="Background">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
            <GradientStop Color="White" Offset="0.0"/>
            <GradientStop Color="LightBlue" Offset="0.5"/>
            <GradientStop Color="Navy" Offset="1"/>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
    </Style>
  </StackPanel.Resources>

  <!--Apply the TextBlockStyle and TextBoxStyle to each 
      TextBlock and TextBox, respectively.-->
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="First Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"/>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="Last Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"
             Margin="6,4,4,4"/>
  </StackPanel>
  <StackPanel x:Name="emailAddressPanel" Orientation="Horizontal"/>
</StackPanel>
private void ShowEmailAddressBox()
{
    TextBlock emailAddressLabel = new TextBlock();
    emailAddressLabel.Text = "Email:";
    emailAddressLabel.Style = (Style)rootPanel.Resources["TextBlockStyle"];

    TextBox emailAddressBox = new TextBox();
    emailAddressBox.Style = (Style)rootPanel.Resources["TextBoxStyle"];
    emailAddressBox.Margin = new Thickness(38, 4, 4, 4);

    emailAddressPanel.Children.Add(emailAddressLabel);
    emailAddressPanel.Children.Add(emailAddressBox);
}

In diesem Beispiel werden zwei Stilelemente erstellt. TargetType für das erste Stilelement ist auf TextBox und TargetType für das zweite Stilelement auf Button festgelegt. Diese werden dann als impliziter Stil für ein TextBox-Steuerelement und ein Button-Steuerelement angewendet.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Foreground" Value="Pink" />
            <Setter Property="FontSize" Value="15" />                
        </Style>
        
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="Background" Value="Yellow" />
        </Style>
    </StackPanel.Resources>
    
    <TextBox Height="30" Width="120" Margin="2" Text="TextBoxStyle" />
    <Button Height="30" Width="100" Margin="2" Content="ButtonStyle" />
</StackPanel>

In diesem Beispiel wird ein Style mit dem Namen InheritedStyle erstellt, der auf einem Style mit dem Namen BaseStyle basiert. InheritedStyle erbt den Background-Wert Gelb von BaseStyle und fügt den Vordergrundwert Rot hinzu.

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="BaseStyle" TargetType="Button">
            <Setter Property="Background" Value="Yellow" />
        </Style>
        <!--Create a Style based on BaseStyle-->
        <Style x:Key="InheritedStyle" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
            <Setter Property="Foreground" Value="Red" />
        </Style>
    </StackPanel.Resources>
    <!--A button with default style-->
    <Button Content="HelloWorld" />
    <!--A button with base style-->
    <Button Content="HelloWorld" Style="{StaticResource BaseStyle}" />
    <!--A button with a style that is inherited from the BaseStyle-->
    <Button Content="HelloWorld" Style="{StaticResource InheritedStyle}" />
</StackPanel>

Hinweise

Ein Style ist im Grunde eine Sammlung von Eigenschafteneinstellungen, die auf eine oder mehrere Instanzen eines bestimmten Typs angewendet werden, der über solche Eigenschaften verfügt. Ein Style-Objekt enthält eine Auflistung von mindestens einem Setter-Objekt . Jeder Setter verfügt über eine Eigenschaft und einen Wert. Die Eigenschaft ist der Name der Eigenschaft des Elements, auf das der Stil angewendet wird. Der Wert ist der Wert, der auf die -Eigenschaft angewendet wird.

Um einen Style anzuwenden, muss das Zielobjekt ein DependencyObject sein. Die Eigenschaft, auf die jeder Setter als Property-Wert verweist, muss eine Abhängigkeitseigenschaft sein.

Sie müssen die TargetType-Eigenschaft festlegen, wenn Sie einen Style erstellen. Andernfalls wird eine Ausnahme ausgelöst.

Wenn Sie einen Wert für dieselbe Eigenschaft in einem Style und auch direkt für ein Element festlegen, hat der für das Element direkt festgelegte Wert Vorrang. Weitere Informationen finden Sie unter Übersicht über Abhängigkeitseigenschaften, insbesondere im Abschnitt "Rangfolge der Abhängigkeitseigenschaft".

Definieren eines Stils als XAML-Ressource

Ein Style wird in XAML fast immer als Ressource in einem ResourceDictionary definiert.

  • Für einen Stil, der nur von anderen UI-Elementen verwendet wird, die auf derselben XAML-Seite definiert sind, definieren Sie den Style in der Regel in der FrameworkElement.Resources-Auflistung (Page.Resources wenn ihr Stammelement ein Page ist).
  • Für einen Stil, der von mehr als einer Seite in Ihrer App verwendet wird, definieren Sie in der Regel den Stil in der Application.Resources-Auflistung . Alternativ können Sie über eine separate XAML-Datei für die App verfügen, die Sie in Application.Resources als MergedDictionaries-Wert einschließen.
  • Die meisten Benutzeroberflächenelemente weisen einen Standardstil auf, der durch die Windows-Runtime definiert wird. Kopien der Standardformatvorlagen finden Sie in der XAML-Datei generic.xaml, die es sich technisch gesehen nicht um eine Ressourcendatei für Apps handelt, obwohl sie wie eine solche strukturiert ist. Sie können einzelne Teile dieser Datei als Ausgangspunkt beim Bearbeiten von Kopien von Formatvorlagen in das XAML Ihrer App kopieren, wie von den Tools aktiviert. Sobald Sie eine solche Kopie erstellt haben, muss sie jedoch in eine der Resources-Auflistungen aufgenommen werden oder indirekt über MergedDictionaries darauf zugegriffen werden. In all diesen Fällen ist der geänderte XAML-Code, der den Standardwert überschreibt, als Teil Ihrer App enthalten.

Windows 8 Wenn Sie ein vorhandenes Steuerelement in Windows 8 XAML neu erstellen, ändern Sie manchmal die Style-Elemente, die in der XAML-Datei StandardStyles.xaml vorhanden sind, die in den meisten startenden App-Vorlagen enthalten ist. Auf StandardStyles.xaml wird von den Vorlagendateien app.xaml als MergedDictionaries-Quelldatei verwiesen. Vorlagen für Apps, die mit Windows 8.1 beginnen, verwenden StandardStyles.xaml nicht mehr.

Ein von Style definiertes Element in einem ResourceDictionary ist nicht erforderlich, um ein x:Key-Attribut oder ein x:Name-Attribut zu haben, was normalerweise eine Voraussetzung für eine XAML-Ressource ist. Ein Stil, der auf diese Weise definiert ist, verwendet seinen TargetType-Eigenschaftswert als impliziten Schlüssel und wird als impliziter Stil bezeichnet.

Weitere Informationen zur Verwendung von XAML-Ressourcenwörterbüchern finden Sie unter ResourceDictionary und XAML-Ressourcenverweise.

Stile und Vorlagen

Sie können einen Setter in einem Style verwenden, um Werte auf jede Abhängigkeitseigenschaft anzuwenden. Es ist jedoch der Setter für die Template-Eigenschaft einer von Control abgeleiteten Klasse, die den Großteil des XAML-Markups in einem typischen Style ausmacht. Der Wert für einen Setter mit Property="Template" wird fast immer als Eigenschaftselement angegeben, das ein ControlTemplate-Objektelement enthält.

Wenn ein Style verwendet wird, um eine Steuerelementvorlage zu definieren, sollten targetType des Style-Elements und TargetType des ControlTemplate-Elements für dessen Control.Template-Setter immer den gleichen Wert verwenden.

Der Vorlagensetter definiert die grundlegende Vorlagen-UI-Definition für ein Steuerelement instance wo diese Vorlage angewendet wird. Sie enthält auch die visuellen Zustände für ein Steuerelement und andere zustandsbasierte UI-Definitionen, z. B. Standarddesignübergänge. Bei einem komplexen Steuerelement wie ListBox können der Standardvorlagenstil und die ControlTemplate in Hunderte von XAML-Zeilen enthalten. Weitere Informationen zur Rolle von Style in Steuerelementvorlagenszenarien finden Sie unter XAML-Steuerelementvorlagenvorlagen.

Die Vorlage für ein Steuerelement enthält häufig visuelle Zustände, die das Erscheinungsbild des Steuerelements als Reaktion auf logische Zustände ändern. Beispielsweise kann eine Schaltfläche eine andere visuelle Darstellung aufweisen, wenn sie durch Anwenden eines neuen visuellen Zustands aus der Vorlage gedrückt wird, und alle Darstellungsänderungen können von XAML und nicht von Code stammen. Weitere Informationen dazu, wie visuelle Zustände funktionieren und wie Sie sie ändern oder Zustände für benutzerdefinierte Steuerelemente definieren, finden Sie unter Storyboardanimationen für visuelle Zustände und XAML-Steuerelementvorlagen.

Stile und Laufzeitverhalten

Sie können die Werte einzelner Eigenschaften ändern, die von einem Style zur Laufzeit festgelegt wurden, und ihre neuen Werte überschreiben die Setters-Werte . Beispielsweise können Sie die Template-Eigenschaft zur Laufzeit festlegen, auch wenn diese Eigenschaft durch einen Stil festgelegt wurde.

Sie können die Eigenschaften eines Stils zur Laufzeit anpassen, aber nur, wenn dieser Stil auf nichts angewendet wurde und nur als Ressource vorhanden ist, die nicht implizit verwendet wird. Sie können der Auflistung in Setters beispielsweise Setter für eine Formatvorlage hinzufügen, die in Resources mit einem x:Key-Attribut vorhanden ist, aber an anderer Stelle in XAML keinen {StaticResource}-Markuperweiterungswert aufweist, der auf diesen Stil verweist. Sobald jedoch von einem geladenen Objekt auf einen Style verwiesen und für Werte verwendet wird, sollte der Style als versiegelt betrachtet werden. Sie können den versiegelten Zustand erkennen, indem Sie den Wert der IsSealed-Eigenschaft für den Style überprüfen. Wenn es true ist, ist die Formatvorlage versiegelt, und Sie können keine Eigenschaften davon oder die Setter-Unterwerte innerhalb ändern. Der Zeitpunkt, zu dem eine Formatvorlage verwendet und versiegelt wurde, kann auch erkannt werden, wenn das Objekt, auf das auf den Style verwiesen wird, sein Loaded-Ereignis auslöst.

BasedOn-Formatvorlagen

Sie können eine neue Formatvorlage basierend auf einer vorhandenen Formatvorlage erstellen, die von Ihrer App definiert wird, oder auf Standardformatvorlagen für Windows-Runtime-Steuerelemente. Dazu können Sie die BasedOn-Eigenschaft verwenden. Dies reduziert die Duplizierung in Ihrem XAML-Code und erleichtert die Verwaltung von Ressourcen. Jede Formatvorlage unterstützt nur eine BasedOn-Formatvorlage . Weitere Informationen finden Sie unter BasedOn oder Styling-Steuerelemente.

Implizite Stile

Sie können Stile so definieren, dass ein Style implizit von allen Objekten desselben TargetType-Objekts verwendet wird, ohne dass jedes instance eines solchen Objekts speziell auf den Style als FrameworkElement.Style-Wert verweisen muss. Wenn eine <Style> Ressource in einem ResourceDictionary ohne x:Key-Attribut deklariert wird, verwendet der x:Key-Wert den Wert der TargetType-Eigenschaft . Wenn Sie den Stil implizit festlegen, wird die Formatvorlage nur auf die Typen angewendet, die genau mit dem TargetType-Wert übereinstimmen, und nicht auf Elemente, die vom TargetType-Wert abgeleitet sind. Wenn Sie beispielsweise implizit eine Formatvorlage für alle ToggleButton-Steuerelemente in Ihrer Anwendung erstellen und Ihre Anwendung über ToggleButton - und CheckBox-Steuerelemente verfügt (CheckBox leitet sich von ToggleButton ab), wird der implizite Stil "ToggleButton" nur auf die ToggleButton-Steuerelemente angewendet.

Hinweise zur XAML-Syntax

Setter ist die XAML-Inhaltseigenschaft für Style, sodass Sie eine implizite Sammlungssyntax wie verwenden <Style><Setter .../><Setter .../></Style>können.

Die Verwendung der Style-Klasse im Code (z. B. aufrufen eines Konstruktors und Erstellen der Setter-Werte nacheinander) ist sehr selten. Stile werden für Vorlagen verwendet, und Vorlagen sollten zur XAML-Ladezeit verfügbar sein, sodass in Code erstellte Stile in der Regel zu spät verfügbar sind, um auf Steuerelemente in einer Benutzeroberfläche angewendet zu werden.

Konstruktoren

Style()

Initialisiert eine neue instance der Style-Klasse ohne anfänglichen TargetType und ohne eine leere Setters-Auflistung.

Style(TypeName)

Initialisiert eine neue instance der Style-Klasse mit einem angegebenen Anfangszieltyp und einer leeren Setters-Auflistung.

Eigenschaften

BasedOn

Ruft einen definierten Stil ab, der die Grundlage für den aktuellen Stil ist, oder legt diesen fest.

Dispatcher

Ruft den CoreDispatcher ab, dem dieses Objekt zugeordnet ist. CoreDispatcher stellt eine Funktion dar, die auf das DependencyObject im UI-Thread zugreifen kann, auch wenn der Code von einem Nicht-UI-Thread initiiert wird.

(Geerbt von DependencyObject)
IsSealed

Ruft einen Wert ab, der angibt, ob der Stil schreibgeschützt ist und nicht geändert werden kann.

Setters

Ruft eine Auflistung von Setter-Objekten ab.

TargetType

Ruft den Typ ab, für den die Formatvorlage vorgesehen ist, oder legt diese fest. TargetType kann verwendet werden, um eine implizite Stilressource zu deklarieren, wenn kein Ressourcenschlüssel angegeben ist.

Methoden

ClearValue(DependencyProperty)

Löscht den lokalen Wert einer Abhängigkeitseigenschaft.

(Geerbt von DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Gibt einen beliebigen Basiswert zurück, der für eine Abhängigkeitseigenschaft eingerichtet wurde, der in Fällen gilt, in denen eine Animation nicht aktiv ist.

(Geerbt von DependencyObject)
GetValue(DependencyProperty)

Gibt den aktuellen effektiven Wert einer Abhängigkeitseigenschaft aus einem DependencyObject zurück.

(Geerbt von DependencyObject)
ReadLocalValue(DependencyProperty)

Gibt den lokalen Wert einer Abhängigkeitseigenschaft zurück, wenn ein lokaler Wert festgelegt ist.

(Geerbt von DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Registriert eine Benachrichtigungsfunktion zum Lauschen auf Änderungen an einer bestimmten DependencyProperty für dieses DependencyObject-instance.

(Geerbt von DependencyObject)
Seal()

Sperrt den Stil, sodass die TargetType-Eigenschaft oder ein Setter in der Setters-Auflistung nicht geändert werden kann.

SetValue(DependencyProperty, Object)

Legt den lokalen Wert einer Abhängigkeitseigenschaft für ein DependencyObject fest.

(Geerbt von DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Bricht eine Änderungsbenachrichtigung ab, die zuvor durch Aufrufen von RegisterPropertyChangedCallback registriert wurde.

(Geerbt von DependencyObject)

Gilt für:

Weitere Informationen