Freigeben über


Style Klasse

Definition

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

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

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 jede TextBlock und zu TextBoxerstellen. Im Beispiel wird die FrameworkElement.Style-Eigenschaft jedes Steuerelements festgelegt, indem auf als Style{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 im Stil für textBox die Margin-Eigenschaft auf 4 festgelegt ist, was bedeutet, dass der TextBox auf allen Seiten einen Rand von 4 aufweist. Um die Länge des zweiten TextBlocks zu kompensieren, der kürzer als der erste TextBlock ist, da Nachname weniger Platz einnimmt als Der Vorname, wird der -Eigenschaft auf der Margin zweiten TextBoxein Wert von "6,4,4,4" zugewiesen. Dies bewirkt, dass der zweite TextBox einen anderen Rand hat, als im Format angegeben, sodass er horizontal an der ersten TextBoxausgerichtet 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. Der TargetType für das erste Stilelement ist auf TextBox festgelegt, und der TargetType für das zweite Stilelement ist auf Buttonfestgelegt. Diese werden dann als implizite Formatvorlage 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 Stylebenannter InheritedStyle erstellt, der auf einem Style benannten BaseStyle basiert. InheritedStyle erbt den Background Wert von Yellow und BaseStyle fügt den Foreground Wert von Redhinzu.

<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 Auflistung von Eigenschafteneinstellungen, die auf eine oder mehrere Instanzen eines bestimmten Typs angewendet werden, der über solche Eigenschaften verfügt. Ein Style enthält eine Auflistung von mindestens einem Setter-Objekt . Jede Setter verfügt über eine Eigenschaft und einen Wert. ist Property der Name der -Eigenschaft des Elements, auf das der Stil angewendet wird. ist Value der Wert, der auf die -Eigenschaft angewendet wird.

Um ein Styleanzuwenden, 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 eine Styleerstellen. Andernfalls wird eine Ausnahme ausgelöst.

Wenn Sie einen Wert für dieselbe Eigenschaft in einem Style und auch für ein Element direkt 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 ein Style , das 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 eine Style , die 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 als Application.ResourcesMergedDictionaries-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.

Ein Style definiertes Element in einem ResourceDictionary ist nicht erforderlich, um ein x:Key-Attribut oder ein x:Name-Attribut zu besitzen, was normalerweise eine Anforderung ist, um eine XAML-Ressource zu sein. Ein Style , 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 die Setter für die Template-Eigenschaft einer control-abgeleiteten Klasse, die den Großteil des XAML-Markups in einem typischen Styledarstellt. Der Wert für ein 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-Steuerelementvorlagen.

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 XAML-Steuerelementvorlagen.

Stile und Laufzeitverhalten

Sie können die Werte einzelner Eigenschaften ändern, die von einer 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 von Style 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 auf einen Style verwiesen wird und von einem geladenen Objekt für Werte verwendet wird, sollte die Style als versiegelt betrachtet werden. Sie können den versiegelten Zustand erkennen, indem Sie den Wert der IsSealed-Eigenschaft für überprüfen Style. Wenn es trueist, ist die Formatvorlage versiegelt, und Sie können keine Eigenschaften davon oder die Setter-Unterwerte in ändern. Der Zeitpunkt, zu dem eine Formatvorlage verwendet und versiegelt wurde, kann auch erkannt werden, wenn das Objekt, auf das verwiesen wird, Style 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 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 übereinstimmen, und nicht auf Elemente, die TargetType vom Wert abgeleitet sind. Wenn Sie beispielsweise implizit eine Formatvorlage für alle ToggleButton-Steuerelemente in Ihrer Anwendung erstellen und Ihre Anwendung über ToggleButtonCheckBox-Steuerelemente verfügt (CheckBox von ToggleButtonabgeleitet), wird die implizite Formatvorlage "ToggleButton" nur auf die ToggleButton Steuerelemente angewendet.

Hinweise zur XAML-Syntax

Setter ist die XAML-Inhaltseigenschaft für Style, sodass Sie eine implizite Auflistungssyntax wie <Style><Setter .../><Setter .../></Style>verwenden 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 Style Code erstellte Elemente 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

Gibt immer in einer Windows App SDK-App zurücknull. Verwenden Sie stattdessen DispatcherQueue .

(Geerbt von DependencyObject)
DispatcherQueue

Ruft den DispatcherQueue ab, dem dieses Objekt zugeordnet ist. Stellt DispatcherQueue eine Funktion dar, die auf den 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