Style Klasse

Definition

Enthält Eigenschaftensetter, die zwischen Instanzen eines Typs gemeinsam verwendet werden können. A Style wird in der Regel in einer Ressourcenauflistung deklariert, sodass sie 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 Formatvorlagen erstellt: eine für einen TextBlock und eine für ein TextBox-Objekt. Jede Formatvorlage wird auf zwei Instanzen eines Steuerelements angewendet, um jeweils ein einheitliches Erscheinungsbild zu TextBlockTextBoxerstellen. Im Beispiel wird die FrameworkElement.Style-Eigenschaft jedes Steuerelements festgelegt, indem auf die StyleMarkuperweiterung {StaticResource} verwiesen wird. Das Beispiel zeigt auch, wie Sie eine Formatvorlage aus einem Ressourcenwörterbuch abrufen und auf ein Steuerelement im Code anwenden.

Jede Formatvorlage weist mehrere Setterteile auf. 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 eine Formatvorlage ist. Weitere Informationen zur XAML-Syntax und dazu, wie die XAML-Inhaltssyntax bestimmte XAML-Elemente impliziert und weglassen kann, finden Sie in der XAML-Syntaxanleitung.

Beachten Sie, dass in der Formatvorlage für das TextBox-Objekt die Margin-Eigenschaft auf 4 festgelegt ist, was bedeutet, dass der TextBox Rand auf allen Seiten 4 ist. Um die Länge des zweiten TextBlock zu kompensieren, der kürzer als der erste TextBlock ist, da Nachname weniger Platz als Vorname benötigt, wird der Eigenschaft auf der Margin zweiten TextBoxein Wert von "6,4,4,4" zugewiesen. Dies bewirkt, dass die zweite TextBox einen anderen Rand aufweist als das, was die Formatvorlage angibt, sodass sie 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 Formatvorlagenelemente erstellt. Das TargetType für das erste Formatvorlagenelement festgelegt TextBox ist und das TargetType zweite Formatvorlagenelement auf Button. 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 Style " InheritedStyle "-Objekt erstellt, das auf einem Style benannten BaseStyle basiert. InheritedStyle erbt den Background Wert von Yellow und BaseStyle addiert einen Foreground Wert von Red.

<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

A Style ist im Grunde eine Sammlung von Eigenschafteneinstellungen, die auf eine oder mehrere Instanzen eines bestimmten Typs angewendet werden, die über solche Eigenschaften verfügen. A Style enthält eine Auflistung eines oder mehrerer Setter-Objekte . Jeder Setter verfügt über eine Eigenschaft und einen Wert. Dies Property ist der Name der Eigenschaft des Elements, auf das die Formatvorlage angewendet wird. Dies Value ist der Wert, der auf die Eigenschaft angewendet wird.

Um ein StyleObjekt anzuwenden, muss das Zielobjekt ein DependencyObject sein. Die Eigenschaft, auf die jeder Setter als Eigenschaftswert verweist, muss eine Abhängigkeitseigenschaft sein.

Sie müssen die TargetType-Eigenschaft festlegen, wenn Sie eine Style. 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 festgelegte Wert Vorrang. Weitere Informationen finden Sie in der Übersicht über Abhängigkeitseigenschaften, insbesondere im Abschnitt "Rangfolge der Abhängigkeitseigenschaft".

Definieren einer Formatvorlage als XAML-Ressource

A Style ist fast immer in XAML als Ressource in einem ResourceDictionary definiert.

  • Für ein Style Element, das nur von anderen UI-Elementen verwendet wird, die auf derselben XAML-Seite definiert sind, definieren Sie in der Regel die Formatvorlage in der FrameworkElement.Resources-Auflistung (Page.Resources wenn das Stammelement eine Seite ist).
  • Für ein Style Format, das von mehr als einer Seite in Ihrer App verwendet wird, definieren Sie in der Regel die Formatvorlage in der Application.Resources-Auflistung . Alternativ können Sie über eine separate XAML-Datei für die App verfügen, die Sie als MergedDictionaries-Wert einschließenApplication.Resources.
  • Die meisten UI-Elemente weisen eine Standardformatvorlage auf, die vom Windows-Runtime definiert wird. Kopien der Standardformatvorlagen können in der XAML-Datei "design-helper" mit dem Namen "generic.xaml" angezeigt werden, was technisch keine Ressourcendatei für Apps ist, obwohl sie wie eine strukturiert ist. Sie können einzelne Teile dieser Datei in den XAML-Code Ihrer App als Ausgangspunkt kopieren, wenn Sie Kopien von Formatvorlagen bearbeiten, die von den Tools aktiviert sind, aber sobald Sie eine solche Kopie erstellt haben, muss sie in einer der Ressourcensammlungen enthalten sein oder indirekt über MergedDictionaries aufgerufen werden. In all diesen Fällen wird der geänderte XAML-Code, der die Standardeinstellung außer Kraft setzt, als Teil Ihrer App enthalten.

Ein Style definiertes Element in einem ResourceDictionary ist nicht erforderlich, um über ein x:Key-Attribut oder x:Name-Attribut zu verfügen, bei dem es sich normalerweise um eine XAML-Ressource handelt. Auf Style diese Weise wird der Wert der TargetType-Eigenschaft als impliziter Schlüssel verwendet und 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 a Style verwenden, um Werte auf jede Abhängigkeitseigenschaft anzuwenden. Dies ist jedoch die SetterEigenschaft "Template " einer von Steuerelement abgeleiteten Klasse, die den Großteil des XAML-Markups in einem typischen Beispiel Styledarstellt. Der Wert für ein Setter With-Objekt Property="Template" wird fast immer als Eigenschaftselement angegeben, das ein ControlTemplate-Objektelement enthält.

Wenn eine Style Steuerelementvorlage definiert wird, sollte der TargetType des Style Elements und der TargetType des ControlTemplate-Elements für seinen Control.Template-Setter immer denselben Wert verwenden.

Der Vorlagensetter definiert die grundlegende Vorlagen-UI-Definition für eine Steuerelementinstanz, auf die diese Vorlage angewendet wird. Sie enthält auch die visuellen Zustände für ein Steuerelement und andere zustandsbasierte UI-Definitionen wie Standarddesignübergänge. Bei komplexen Steuerelementen wie ListBox kann die Standardvorlagenvorlage "Style" und " ControlTemplate " Hunderte von XAML-Zeilen enthalten. Weitere Informationen zur Rolle von Style Steuerelementvorlagen 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 ein anderes visuelles Erscheinungsbild aufweisen, wenn sie gedrückt wird, indem ein neuer visueller Zustand aus der Vorlage angewendet wird, und alle Darstellungsänderungen können aus XAML und nicht aus Code stammen. Weitere Informationen zur Funktionsweise visueller Zustände und zum Ändern oder Definieren von Zuständen für benutzerdefinierte Steuerelemente finden Sie unter XAML-Steuerelementvorlagen.

Stile und Laufzeitverhalten

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

Sie können die Eigenschaften einer Style Laufzeit anpassen, aber nur, wenn diese Formatvorlage nicht auf etwas 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 Ressourcen mit einem x:Key-Attribut vorhanden ist, aber keinen {StaticResource}-Markuperweiterungswert an anderer Stelle in XAML aufweist, die sich auf diese Formatvorlage bezieht. Sobald jedoch auf eine Formatvorlage verwiesen wird und für Werte von einem geladenen Objekt verwendet wird, sollte dies Style als versiegelt betrachtet werden. Sie können den versiegelten Zustand erkennen, indem Sie den Wert der IsSealed-Eigenschaft für die Style. Wenn dies der Fall ist true, ist die Formatvorlage versiegelt, und Sie können keine Eigenschaften davon oder die Setter-Unterwerte innerhalb ändern. Der Zeitpunkt, an dem eine Formatvorlage verwendet und versiegelt wurde, kann auch erkannt werden, wenn das Objekt, auf Style das 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 oder standardmäßigen Formatvorlagen für Windows-Runtime-Steuerelemente definiert wird. Dazu können Sie die BasedOn-Eigenschaft verwenden. Dadurch wird die Duplizierung in Xaml reduziert und die Verwaltung von Ressourcen vereinfacht. Jede Formatvorlage unterstützt nur eine BasedOn Formatvorlage. Weitere Informationen finden Sie unter BasedOn oder Formatieren von Steuerelementen.

Implizite Formatvorlagen

Sie können Formatvorlagen so definieren, dass eine Style implizit von allen Objekten desselben TargetType verwendet wird, ohne dass jede Instanz eines solchen Objekts explizit auf den Style als FrameworkElement.Style-Wert verweist. Wenn eine <Style> Ressource in einem ResourceDictionary ohne ein x:Key-Attribut deklariert wird, verwendet der x:Key-Wert den Wert der TargetType Eigenschaft. Wenn Sie die Formatvorlage implizit festlegen, wird die Formatvorlage nur auf die Typen angewendet, die exakt TargetType und nicht auf Elemente angewendet werden, die TargetType vom Wert abgeleitet wurden. Wenn Sie z. B. implizit eine Formatvorlage für alle ToggleButton-Steuerelemente in Ihrer Anwendung erstellen, und Ihre Anwendung verfügt ToggleButton und CheckBox-Steuerelemente (CheckBox abgeleitet von ToggleButton), wird die implizite Formatvorlage "ToggleButton" nur auf die ToggleButton Steuerelemente angewendet.

Hinweise zur XAML-Syntax

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

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

Konstruktoren

Name Beschreibung
Style()

Initialisiert eine neue Instanz der Style-Klasse ohne anfänglichen TargetType und einer leeren Setters-Auflistung .

Style(TypeName)

Initialisiert eine neue Instanz der Style-Klasse mit einem angegebenen anfänglichen TargetType und einer leeren Setters-Auflistung .

Eigenschaften

Name Beschreibung
BasedOn

Dient zum Abrufen oder Festlegen einer definierten Formatvorlage, die die Basis der aktuellen Formatvorlage ist.

Dispatcher

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

(Geerbt von DependencyObject)
DispatcherQueue

Ruft ab DispatcherQueue , dem dieses Objekt zugeordnet ist. Dies DispatcherQueue stellt eine Einrichtung dar, die auf den DependencyObject 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 die Formatvorlage schreibgeschützt ist und nicht geändert werden kann.

Setters

Ruft eine Auflistung von Setter -Objekten ab.

TargetType

Dient zum Abrufen oder Festlegen des Typs, für den die Formatvorlage vorgesehen ist. TargetType kann verwendet werden, um eine implizite Stilressource zu deklarieren, wenn kein Ressourcenschlüssel angegeben ist.

Methoden

Name Beschreibung
ClearValue(DependencyProperty)

Löscht den lokalen Wert einer Abhängigkeitseigenschaft.

(Geerbt von DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Gibt einen Basiswert zurück, der für eine Abhängigkeitseigenschaft eingerichtet wurde, was in Fällen angewendet wird, 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 wird.

(Geerbt von DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Registriert eine Benachrichtigungsfunktion, um Änderungen an einer bestimmten DependencyProperty für diese DependencyObject-Instanz zu überwachen.

(Geerbt von DependencyObject)
Seal()

Sperrt die Formatvorlage, sodass die TargetType-Eigenschaft oder ein beliebiger 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