Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mithilfe von Windows Presentation Foundation (WPF) können Sie die Darstellung eines vorhandenen Steuerelements anpassen, indem Sie einen eigenen wiederverwendbaren Stil erstellen. Sie können Formatvorlagen global auf Ihre App, Fenster und Seiten oder direkt auf Steuerelemente anwenden.
Erstellen eines Stils
Stellen Sie sich eine Style bequeme Möglichkeit vor, einen Satz von Eigenschaftswerten auf ein oder mehrere Elemente anzuwenden. Sie können eine Formatvorlage für jedes Element verwenden, das von FrameworkElement oder FrameworkContentElement abgeleitet ist, wie z. B. ein Window oder ein Button.
Die am häufigsten verwendete Methode zum Deklarieren einer Formatvorlage ist eine Ressource im Resources Abschnitt einer XAML-Datei. Da Es sich bei Formatvorlagen um Ressourcen handelt, folgen sie den gleichen Bereichsregeln wie alle Ressourcen. Der Ort, an dem Sie eine Formatvorlage deklarieren, beeinflusst, wo Sie sie anwenden können. Wenn Sie z. B. die Formatvorlage im Stammelement der XAML-Datei der App-Definition deklarieren, können Sie die Formatvorlage an einer beliebigen Stelle in Ihrer App verwenden.
<Application x:Class="IntroToStylingAndTemplating.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:IntroToStylingAndTemplating"
StartupUri="WindowExplicitStyle.xaml">
<Application.Resources>
<ResourceDictionary>
<Style x:Key="Header1" TargetType="TextBlock">
<Setter Property="FontSize" Value="15" />
<Setter Property="FontWeight" Value="ExtraBold" />
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>
Wenn Sie die Formatvorlage in einer der XAML-Dateien der App deklarieren, können Sie die Formatvorlage nur in dieser XAML-Datei verwenden. Weitere Informationen zu Geltungsbereichsregeln für Ressourcen finden Sie in der Übersicht zu XAML-Ressourcen.
<Window x:Class="IntroToStylingAndTemplating.WindowSingleResource"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:IntroToStylingAndTemplating"
mc:Ignorable="d"
Title="WindowSingleResource" Height="450" Width="800">
<Window.Resources>
<Style x:Key="Header1" TargetType="TextBlock">
<Setter Property="FontSize" Value="15" />
<Setter Property="FontWeight" Value="ExtraBold" />
</Style>
</Window.Resources>
<Grid />
</Window>
Eine Formatvorlage besteht aus <Setter>-Unterelementen, die Eigenschaften für die Elemente festlegen, auf die die Formatvorlage angewendet wird. Im vorherigen Beispiel wird die Formatvorlage mithilfe des TargetType-Attributs auf TextBlock-Typen angewendet. Die Formatvorlage setzt FontSize auf 15 und FontWeight auf ExtraBold. Fügen Sie ein <Setter> für jede Eigenschaft hinzu, deren Formatvorlage geändert wird.
Implizite Anwendung eines Stils
A Style ist eine bequeme Möglichkeit, einen Satz von Eigenschaftswerten auf mehrere Elemente anzuwenden. Betrachten Sie beispielsweise die folgenden TextBlock Elemente und deren Standarddarstellung in einem Fenster.
<StackPanel>
<TextBlock>My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>
Sie können die Standarddarstellung ändern, indem Sie Eigenschaften wie FontSize z. B. und FontFamily, für jedes TextBlock Element direkt festlegen. Wenn Sie jedoch möchten, dass Ihre TextBlock Elemente einige Eigenschaften freigeben, können Sie einen Style im Resources Abschnitt Ihrer XAML-Datei erstellen, wie hier gezeigt.
<Window.Resources>
<!--A Style that affects all TextBlocks-->
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontFamily" Value="Comic Sans MS"/>
<Setter Property="FontSize" Value="14"/>
</Style>
</Window.Resources>
Wenn Sie die Formatvorlage auf den TextBlock Typ festlegen und das x:Key Attribut weglassen, gilt die Formatvorlage für alle TextBlock Elemente, die in den Bereich der Formatvorlage fallen, was normalerweise die XAML-Datei selbst ist.
Nun werden die TextBlock Elemente wie folgt angezeigt.
Explizites Anwenden einer Formatvorlage
Wenn Sie der Formatvorlage ein x:Key Attribut mit einem Wert hinzufügen, gilt die Formatvorlage nicht mehr implizit für alle Elemente von TargetType. Nur Elemente, die explizit auf den Stil verweisen, erhalten ihn.
Dies ist der Stil aus dem vorherigen Abschnitt, aber mit dem x:Key-Attribut deklariert.
<Window.Resources>
<Style x:Key="TitleText" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontFamily" Value="Comic Sans MS"/>
<Setter Property="FontSize" Value="14"/>
</Style>
</Window.Resources>
Um die Formatvorlage anzuwenden, legen Sie die Eigenschaft Style des Elements auf den Wert x:Key fest, indem Sie eine StaticResource-Markuperweiterung verwenden, wie hier gezeigt.
<StackPanel>
<TextBlock Style="{StaticResource TitleText}">My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>
Beachten Sie, dass auf das erste TextBlock-Element der Stil angewendet wurde, während das zweite Textblock-Element unverändert bleibt. Die implizite Formatvorlage aus dem vorherigen Abschnitt wurde in eine Formatvorlage geändert, die das x:Key Attribut deklariert hat. Der Stil wirkt sich nur auf Elemente aus, die direkt darauf verweisen.
Sobald Sie eine Formatvorlage explizit oder implizit anwenden, wird sie versiegelt und kann nicht geändert werden. Wenn Sie eine Formatvorlage ändern möchten, erstellen Sie eine neue Formatvorlage, um die vorhandene zu ersetzen. Weitere Informationen finden Sie in den Ausführungen zur IsSealed-Eigenschaft.
Sie können ein Objekt erstellen, das mithilfe benutzerdefinierter Logik eine Formatvorlage auswählt, die angewendet werden soll. Ein Beispiel finden Sie im Beispiel für die StyleSelector Klasse.
Programmgesteuertes Anwenden einer Formatvorlage
Um einem Element programmgesteuert eine benannte Formatvorlage zuzuweisen, rufen Sie die Formatvorlage aus der Ressourcenauflistung ab, und weisen Sie sie der Eigenschaft des Style Elements zu. Die Elemente in einer Ressourcenauflistung sind vom Typ Object. Daher müssen Sie die abgerufene Formatvorlage in ein System.Windows.Style Format umwandeln, bevor Sie sie der Style Eigenschaft zuweisen. Zum Beispiel legt der folgende Code die Formatierung einer TextBlock mit dem Namen textblock1 auf die definierte Formatvorlage TitleText fest.
textblock1.Style = (Style)Resources["TitleText"];
textblock1.Style = CType(Resources("TitleText"), Windows.Style)
Erweitern einer Formatvorlage
Möglicherweise möchten Sie, dass Ihre zwei TextBlock Elemente einige Eigenschaftswerte teilen, wie etwa das FontFamily oder das zentrierte HorizontalAlignment. Sie möchten aber auch, dass der Text "Meine Bilder" einige zusätzliche Eigenschaften aufweist. Dazu können Sie eine neue Formatvorlage erstellen, die auf der ersten Formatvorlage basiert, wie im folgenden Beispiel gezeigt.
<Window.Resources>
<!-- .... other resources .... -->
<!--A Style that affects all TextBlocks-->
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="FontFamily" Value="Comic Sans MS"/>
<Setter Property="FontSize" Value="14"/>
</Style>
<!--A Style that extends the previous TextBlock Style with an x:Key of TitleText-->
<Style BasedOn="{StaticResource {x:Type TextBlock}}"
TargetType="TextBlock"
x:Key="TitleText">
<Setter Property="FontSize" Value="26"/>
<Setter Property="Foreground">
<Setter.Value>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.0" Color="#90DDDD" />
<GradientStop Offset="1.0" Color="#5BFFFF" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
Anschließend wenden Sie die Formatvorlage auf ein TextBlock an.
<StackPanel>
<TextBlock Style="{StaticResource TitleText}" Name="textblock1">My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>
Diese TextBlock Formatvorlage ist jetzt zentriert, verwendet eine Comic Sans MS Schriftart mit einem Schriftgrad 26und legt die Vordergrundfarbe auf das LinearGradientBrush im Beispiel gezeigte fest. Er überschreibt den FontSize Wert der Basisformatvorlage. Wenn mehr als eine Setter auf dieselbe Eigenschaft in einem Style verweist, hat das zuletzt deklarierte Setter Vorrang.
Die folgende Abbildung zeigt, wie die TextBlock Elemente jetzt aussehen:
Diese TitleText-Formatvorlage erweitert diejenige, die Sie für den TextBlock-Typ erstellt haben und auf die mit BasedOn="{StaticResource {x:Type TextBlock}}" verwiesen wird. Sie können auch eine Formatvorlage erweitern, die x:Key über die x:Key Formatvorlage verfügt. Wenn beispielsweise eine Formatvorlage benannt Header1 wurde und Sie diese Formatvorlage erweitern möchten, würden Sie verwenden BasedOn="{StaticResource Header1}".
Beziehung der TargetType-Eigenschaft und des x:Key-Attributs
Wie weiter oben gezeigt, bewirkt das Festlegen der TargetType Eigenschaft auf TextBlock ohne Zuweisung einer x:Key, dass die Formatvorlage auf alle TextBlock Elemente angewendet wird. In diesem Fall wird die x:Key-Eigenschaft implizit auf {x:Type TextBlock} gesetzt. Dieses Verhalten bedeutet, dass, wenn Sie den x:Key Wert explizit auf einen anderen {x:Type TextBlock}Wert als festlegen, dies Style gilt nicht automatisch für alle TextBlock Elemente. Stattdessen müssen Sie die Formatvorlage (mithilfe des x:Key-Werts) explizit auf die TextBlock-Elemente anwenden. Wenn sich Ihr Stil im Ressourcenabschnitt befindet und Sie die TargetType Eigenschaft für Ihren Stil nicht festgelegt haben, müssen Sie das x:Key Attribut festlegen.
Zusätzlich zur Bereitstellung eines Standardwerts für die x:KeyEigenschaft gibt die TargetType Eigenschaft den Typ an, auf den Settereigenschaften angewendet werden. Wenn Sie kein TargetType angeben, müssen Sie die Eigenschaften in Ihren Setter Objekten mithilfe eines Klassennamens mit der Syntax Property="ClassName.Property" qualifizieren. Statt die Einstellung Property="FontSize" zu verwenden, müssen Sie Property auf "TextBlock.FontSize" oder "Control.FontSize" setzen.
Beachten Sie außerdem, dass viele WPF-Steuerelemente aus einer Kombination anderer WPF-Steuerelemente bestehen. Wenn Sie eine Formatvorlage erstellen, die für alle Steuerelemente eines Typs gilt, erhalten Sie möglicherweise unerwartete Ergebnisse. Wenn Sie z. B. eine Formatvorlage erstellen, die auf den TextBlock Typ in einer WindowFormatvorlage ausgerichtet ist, gilt die Formatvorlage für alle TextBlock Steuerelemente im Fenster, auch wenn der TextBlock Teil eines anderen Steuerelements ist, z. B. ein ListBox.
Siehe auch
.NET Desktop feedback