Exemplarische Vorgehensweise: Erstellen einer Schaltfläche mit XAML
In dieser exemplarischen Vorgehensweise wird erläutert, wie Sie eine animierte Schaltfläche für die Verwendung in einer WPF-Anwendung (Windows Presentation Foundation) erstellen. In der exemplarischen Vorgehensweise werden Stile und eine Vorlage verwendet, um eine angepasste Schaltflächenressource zu erstellen, die es ermöglicht, Code wiederzuverwenden und die Schaltflächenlogik von der Schaltflächendeklaration zu trennen. Diese exemplarische Vorgehensweise ist vollständig in XAML (Extensible Application Markup Language) geschrieben.
Wichtig
In dieser exemplarischen Vorgehensweise werden Sie durch die Schritte zum Erstellen der Anwendung geführt, indem Sie XAML-Code (Extensible Application Markup Language) in Visual Studio eingeben oder einfügen. Wenn Sie lieber erfahren möchten, wie Sie einen Designer zum Erstellen derselben Anwendung verwenden können, lesen Sie unter Erstellen einer Schaltfläche mit Microsoft Expression Blend nach.
Die folgende Abbildung zeigt die fertigen Schaltflächen.
Erstellen der grundlegenden Schaltflächen
Sie beginnen mit dem Erstellen eines neuen Projekts und dem Hinzufügen einiger Schaltflächen zum Fenster.
So erstellen Sie ein neues WPF-Projekt und fügen dem Fenster Schaltflächen hinzu
Starten Sie Visual Studio.
Erstellen eines neuen WPF-Projekts: Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Suchen Sie die Vorlage Windows Application (WPF), und benennen Sie das Projekt mit „AnimatedButton“. Dadurch wird das Gerüst für die Anwendung erstellt.
Hinzufügen grundlegender Standardschaltflächen: Alle Dateien, die Sie für diese exemplarische Vorgehensweise benötigen, werden von der Vorlage bereitgestellt. Öffnen Sie die Datei „Window1.xaml“, indem Sie im Projektmappen-Explorer darauf doppelklicken. Standardmäßig gibt es ein Grid-Element in „Window1.xaml“. Entfernen Sie das Grid-Element, und fügen Sie der XAML-Seite (Extensible Application Markup Language) einige Schaltflächen hinzu, indem Sie den folgenden hervorgehobenen Code in der „Window1.xaml“ eingeben oder einfügen:
<Window x:Class="AnimatedButton.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="AnimatedButton" Height="300" Width="300" Background="Black"> <!-- Buttons arranged vertically inside a StackPanel. --> <StackPanel HorizontalAlignment="Left"> <Button>Button 1</Button> <Button>Button 2</Button> <Button>Button 3</Button> </StackPanel> </Window>
Drücken Sie F5, um die Anwendung auszuführen. Sie sollten eine Reihe von Schaltflächen sehen, die wie in der folgenden Abbildung aussehen.
Nachdem Sie die grundlegenden Schaltflächen erstellt haben, sind Sie mit der Arbeit an der Datei „Window1.xaml“ fertig. Die restliche exemplarische Vorgehensweise führen Sie hauptsächlich in der Datei „app.xaml“ aus, in der Sie Stile und eine Vorlage für die Schaltflächen definieren.
Festlegen grundlegender Eigenschaften
Als Nächstes legen Sie einige Eigenschaften dieser Schaltflächen fest, um die Darstellung und das Layout der Schaltflächen zu steuern. Anstatt die Eigenschaften für die Schaltflächen einzeln festzulegen, verwenden Sie Ressourcen, um Schaltflächeneigenschaften für die gesamte Anwendung zu definieren. Anwendungsressourcen sind konzeptionell ähnlich wie externe Cascading Stylesheets (CSS) für Webseiten. Ressourcen sind jedoch viel effizienter als Cascading Stylesheets (CSS), wie Sie am Ende dieser exemplarischen Vorgehensweise sehen werden. Weitere Informationen zu Ressourcen finden Sie unter XAML-Ressourcen.
So verwenden Sie Stile zum Festlegen grundlegender Eigenschaften von Schaltflächen
Definieren eines Application.Resources-Blocks: Öffnen Sie die Datei „app.xaml“, und fügen Sie das folgende hervorgehobene Markup hinzu, wenn es noch nicht vorhanden ist:
<Application x:Class="AnimatedButton.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml" > <Application.Resources> <!-- Resources for the entire application can be defined here. --> </Application.Resources> </Application>
Der Ressourcenbereich wird dadurch bestimmt, wo Sie die Ressource definieren. Durch das Definieren von Ressourcen in
Application.Resources
in der Datei „app.xaml“ kann die Ressource an jeder beliebigen Stelle in der Anwendung verwendet werden. Weitere Informationen zum Definieren des Bereichs Ihrer Ressourcen finden Sie unter XAML-Ressourcen.Erstellen eines Stils und definieren grundlegender Eigenschaftswerte: Fügen Sie dem
Application.Resources
-Block das folgende Markup hinzu. Dieses Markup erstellt einen Style, der auf alle Schaltflächen in der Anwendung angewandt wird, indem die Width der Schaltflächen auf 90 und die Margin auf 10 festgelegt werden:<Application.Resources> <Style TargetType="Button"> <Setter Property="Width" Value="90" /> <Setter Property="Margin" Value="10" /> </Style> </Application.Resources>
Die TargetType-Eigenschaft gibt an, dass der Stil auf alle Objekte vom Typ Button angewandt wird. Jeder Setter legt einen anderen Eigenschaftswert für den Style fest. Daher weist zu diesem Zeitpunkt jede Schaltfläche in der Anwendung eine Breite von 90 und einen Rand von 10 auf. Wenn Sie F5 drücken, um die Anwendung auszuführen, wird das folgende Fenster angezeigt.
Sie können mit Stilen noch viel mehr erreichen, einschließlich einer Vielzahl von Möglichkeiten zum Optimieren der Zielobjekte, der Angabe komplexer Eigenschaftswerte und sogar der Verwendung von Stilen als Eingabe für andere Stile. Weitere Informationen finden Sie unter Erstellen von Formaten und Vorlagen.
Festlegen eines Stileigenschaftswerts für eine Ressource: Ressourcen bieten eine einfache Möglichkeit, häufig definierte Objekte und Werte wiederzuverwenden. Sie sind besonders nützlich, um komplexe Werte mithilfe von Ressourcen zu definieren, um Ihren Code modularer zu gestalten. Fügen Sie das folgende hervorgehobene Markup in „app.xaml“ ein.
<Application.Resources> <LinearGradientBrush x:Key="GrayBlueGradientBrush" StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="DarkGray" Offset="0" /> <GradientStop Color="#CCCCFF" Offset="0.5" /> <GradientStop Color="DarkGray" Offset="1" /> </LinearGradientBrush> <Style TargetType="{x:Type Button}"> <Setter Property="Background" Value="{StaticResource GrayBlueGradientBrush}" /> <Setter Property="Width" Value="80" /> <Setter Property="Margin" Value="10" /> </Style> </Application.Resources>
Sie haben direkt unter dem
Application.Resources
-Block eine Ressource namens „GrayBlueGradientBrush“ erstellt. Diese Ressource definiert einen horizontalen Farbverlauf. Sie kann von überall in der Anwendung als Eigenschaftswert verwendet werden, auch innerhalb des Schaltflächenstilsetters für die Background-Eigenschaft. Jetzt verfügen alle Schaltflächen über einen Background-Eigenschaftswert mit diesem Farbverlauf.Drücken Sie F5, um die Anwendung auszuführen. Diese sollte wie folgt aussehen:
Erstellen einer Vorlage zum Definieren des Aussehens der Schaltfläche
In diesem Abschnitt erstellen Sie eine Vorlage, die die Darstellung der Schaltfläche angepasst. Die Schaltflächendarstellung umfasst mehrere Objekte, einschließlich eines Rechtecks und anderen Komponenten, um der Schaltfläche ein einzigartiges Aussehen zu verleihen.
Bisher war die Steuerung des Aussehens von Schaltflächen in der Anwendung auf Änderungen an den Eigenschaften der Schaltfläche beschränkt. Was wäre, wenn Sie noch radikalere Änderungen an der Darstellung der Schaltfläche vornehmen könnten? Vorlagen ermöglichen eine umfassende Steuerung der Darstellung eines Objekts. Da Vorlagen innerhalb von Stilen verwendet werden können, können Sie eine Vorlage auf alle Objekte anwenden, für die der Stil gilt (in dieser exemplarischen Vorgehensweise die Schaltfläche).
So definieren Sie das Aussehen der Schaltfläche mithilfe der Vorlage
Einrichten der Vorlage: Da Steuerelemente wie Button eine Template-Eigenschaft besitzen, können Sie den Eigenschaftswert in der Vorlage genauso wie die anderen Eigenschaftswerte definieren, die Sie in einem Style mit einem Setter festgelegt haben. Fügen Sie dem Schaltflächenstil das folgende hervorgehobene Markup hinzu.
<Application.Resources> <LinearGradientBrush x:Key="GrayBlueGradientBrush" StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="DarkGray" Offset="0" /> <GradientStop Color="#CCCCFF" Offset="0.5" /> <GradientStop Color="DarkGray" Offset="1" /> </LinearGradientBrush> <Style TargetType="{x:Type Button}"> <Setter Property="Background" Value="{StaticResource GrayBlueGradientBrush}" /> <Setter Property="Width" Value="80" /> <Setter Property="Margin" Value="10" /> <Setter Property="Template"> <Setter.Value> <!-- The button template is defined here. --> </Setter.Value> </Setter> </Style> </Application.Resources>
Ändern der Schaltflächendarstellung: An diesem Punkt müssen Sie eine Vorlage definieren. Fügen Sie das folgende hervorgehobene Markup hinzu. Dieses Markup gibt zwei Rectangle-Elemente mit abgerundeten Kanten gefolgt von einem DockPanel an. Das DockPanel wird verwendet, um den ContentPresenter der Schaltfläche zu hosten. Ein ContentPresenter zeigt den Inhalt der Schaltfläche an. In dieser exemplarischen Vorgehensweise ist der Inhalt Text („Button 1“, „Button 2“, „Button 3“). Alle Vorlagenkomponenten (die Rechtecke und der DockPanel) befinden sich in einem Grid.
<Setter.Value> <ControlTemplate TargetType="Button"> <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" ClipToBounds="True"> <!-- Outer Rectangle with rounded corners. --> <Rectangle x:Name="outerRectangle" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="{TemplateBinding Background}" RadiusX="20" RadiusY="20" StrokeThickness="5" Fill="Transparent" /> <!-- Inner Rectangle with rounded corners. --> <Rectangle x:Name="innerRectangle" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="Transparent" StrokeThickness="20" Fill="{TemplateBinding Background}" RadiusX="20" RadiusY="20" /> <!-- Present Content (text) of the button. --> <DockPanel Name="myContentPresenterDockPanel"> <ContentPresenter x:Name="myContentPresenter" Margin="20" Content="{TemplateBinding Content}" TextBlock.Foreground="Black" /> </DockPanel> </Grid> </ControlTemplate> </Setter.Value>
Drücken Sie F5, um die Anwendung auszuführen. Diese sollte wie folgt aussehen:
Hinzufügen eines Glaseffekts zur Vorlage: Als Nächstes fügen Sie einen Glaseffekt hinzu. Zunächst erstellen Sie einige Ressourcen, die einen Farbverlauf mit Glaseffekt erzeugen. Fügen Sie diese Farbverlaufsressourcen überall im
Application.Resources
-Block hinzu:<Application.Resources> <GradientStopCollection x:Key="MyGlassGradientStopsResource"> <GradientStop Color="WhiteSmoke" Offset="0.2" /> <GradientStop Color="Transparent" Offset="0.4" /> <GradientStop Color="WhiteSmoke" Offset="0.5" /> <GradientStop Color="Transparent" Offset="0.75" /> <GradientStop Color="WhiteSmoke" Offset="0.9" /> <GradientStop Color="Transparent" Offset="1" /> </GradientStopCollection> <LinearGradientBrush x:Key="MyGlassBrushResource" StartPoint="0,0" EndPoint="1,1" Opacity="0.75" GradientStops="{StaticResource MyGlassGradientStopsResource}" /> <!-- Styles and other resources below here. -->
Diese Ressourcen werden als Fill für das Rechteck verwendet, das Sie in das Grid der Schaltflächenvorlage einfügen. Fügen Sie das folgende hervorgehobene Markup in die Vorlage ein.
<Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" ClipToBounds="True"> <!-- Outer Rectangle with rounded corners. --> <Rectangle x:Name="outerRectangle" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="{TemplateBinding Background}" RadiusX="20" RadiusY="20" StrokeThickness="5" Fill="Transparent" /> <!-- Inner Rectangle with rounded corners. --> <Rectangle x:Name="innerRectangle" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="Transparent" StrokeThickness="20" Fill="{TemplateBinding Background}" RadiusX="20" RadiusY="20" /> <!-- Glass Rectangle --> <Rectangle x:Name="glassCube" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" StrokeThickness="2" RadiusX="10" RadiusY="10" Opacity="0" Fill="{StaticResource MyGlassBrushResource}" RenderTransformOrigin="0.5,0.5"> <Rectangle.Stroke> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <LinearGradientBrush.GradientStops> <GradientStop Offset="0.0" Color="LightBlue" /> <GradientStop Offset="1.0" Color="Gray" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Rectangle.Stroke> <!-- These transforms have no effect as they are declared here. The reason the transforms are included is to be targets for animation (see later). --> <Rectangle.RenderTransform> <TransformGroup> <ScaleTransform /> <RotateTransform /> </TransformGroup> </Rectangle.RenderTransform> <!-- A BevelBitmapEffect is applied to give the button a "Beveled" look. --> <Rectangle.BitmapEffect> <BevelBitmapEffect /> </Rectangle.BitmapEffect> </Rectangle> <!-- Present Text of the button. --> <DockPanel Name="myContentPresenterDockPanel"> <ContentPresenter x:Name="myContentPresenter" Margin="20" Content="{TemplateBinding Content}" TextBlock.Foreground="Black" /> </DockPanel> </Grid> </ControlTemplate> </Setter.Value>
Beachten Sie, dass die Opacity des Rechtecks mit der
x:Name
-Eigenschaft „glassCube“ den Wert „0“ hat. Wenn Sie das Beispiel ausführen, wird das Rechteck mit dem Glaseffekt daher nicht überlagert angezeigt. Dazu fügen Sie später der Vorlage Trigger hinzu, wenn Benutzer*innen mit der Schaltfläche interagieren. Sie können jedoch sehen, wie die Schaltfläche jetzt aussieht, indem Sie den Wert von Opacity in „1“ ändern und die Anwendung ausführen. Dies wird in der folgenden Abbildung veranschaulicht. Bevor Sie mit dem nächsten Schritt fortfahren, ändern Sie Opacity zurück in „0“.
Erstellen von Schaltflächeninteraktivität
In diesem Abschnitt erstellen Sie Trigger für Eigenschaften und Ereignisse, um als Reaktion auf Benutzeraktionen Eigenschaftswerte zu ändern und Animationen auszuführen, z. B. beim Bewegen des Mauszeigers über die Schaltfläche und beim Klicken.
Eine einfache Möglichkeit zum Hinzufügen von Interaktivität (Bewegen des Mauszeigers auf die Schaltfläche und von der Schaltfläche weg, Klicken usw.) besteht darin, Trigger innerhalb Ihrer Vorlage oder Ihres Stils zu definieren. Um einen Trigger zu erstellen, definieren Sie eine „Eigenschaftsbedingung“, z. B.: Der IsMouseOver-Eigenschaftswert der Schaltfläche ist gleich true
. Anschließend definieren Sie Setter (Aktionen), die ausgeführt werden, wenn die Triggerbedingung erfüllt ist.
So erstellen Sie Schaltflächeninteraktivität
Hinzufügen von Vorlagentriggern: Fügen Sie der Vorlage das hervorgehobene Markup hinzu.
<Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" ClipToBounds="True"> <!-- Outer Rectangle with rounded corners. --> <Rectangle x:Name="outerRectangle" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="{TemplateBinding Background}" RadiusX="20" RadiusY="20" StrokeThickness="5" Fill="Transparent" /> <!-- Inner Rectangle with rounded corners. --> <Rectangle x:Name="innerRectangle" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stroke="Transparent" StrokeThickness="20" Fill="{TemplateBinding Background}" RadiusX="20" RadiusY="20" /> <!-- Glass Rectangle --> <Rectangle x:Name="glassCube" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" StrokeThickness="2" RadiusX="10" RadiusY="10" Opacity="0" Fill="{StaticResource MyGlassBrushResource}" RenderTransformOrigin="0.5,0.5"> <Rectangle.Stroke> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <LinearGradientBrush.GradientStops> <GradientStop Offset="0.0" Color="LightBlue" /> <GradientStop Offset="1.0" Color="Gray" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Rectangle.Stroke> <!-- These transforms have no effect as they are declared here. The reason the transforms are included is to be targets for animation (see later). --> <Rectangle.RenderTransform> <TransformGroup> <ScaleTransform /> <RotateTransform /> </TransformGroup> </Rectangle.RenderTransform> <!-- A BevelBitmapEffect is applied to give the button a "Beveled" look. --> <Rectangle.BitmapEffect> <BevelBitmapEffect /> </Rectangle.BitmapEffect> </Rectangle> <!-- Present Text of the button. --> <DockPanel Name="myContentPresenterDockPanel"> <ContentPresenter x:Name="myContentPresenter" Margin="20" Content="{TemplateBinding Content}" TextBlock.Foreground="Black" /> </DockPanel> </Grid> <ControlTemplate.Triggers> <!-- Set action triggers for the buttons and define what the button does in response to those triggers. --> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value>
Hinzufügen von Eigenschaftsauslösern: Fügen Sie im
ControlTemplate.Triggers
-Block das hervorgehobene Markup hinzu:<ControlTemplate.Triggers> <!-- Set properties when mouse pointer is over the button. --> <Trigger Property="IsMouseOver" Value="True"> <!-- Below are three property settings that occur when the condition is met (user mouses over button). --> <!-- Change the color of the outer rectangle when user mouses over it. --> <Setter Property ="Rectangle.Stroke" TargetName="outerRectangle" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> <!-- Sets the glass opacity to 1, therefore, the glass "appears" when user mouses over it. --> <Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" /> <!-- Makes the text slightly blurry as though you were looking at it through blurry glass. --> <Setter Property="ContentPresenter.BitmapEffect" TargetName="myContentPresenter"> <Setter.Value> <BlurBitmapEffect Radius="1" /> </Setter.Value> </Setter> </Trigger> <ControlTemplate.Triggers/>
Drücken Sie F5, um die Anwendung auszuführen, und beachten Sie den Effekt, wenn Sie den Mauszeiger über die Schaltflächen bewegen.
Hinzufügen eines Fokustriggers: Als Nächstes fügen Sie einige ähnliche Setter hinzu, um den Fall zu behandeln, wenn die Schaltfläche den Fokus hat (z. B. nachdem Benutzer*innen darauf klicken).
<ControlTemplate.Triggers> <!-- Set properties when mouse pointer is over the button. --> <Trigger Property="IsMouseOver" Value="True"> <!-- Below are three property settings that occur when the condition is met (user mouses over button). --> <!-- Change the color of the outer rectangle when user mouses over it. --> <Setter Property ="Rectangle.Stroke" TargetName="outerRectangle" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> <!-- Sets the glass opacity to 1, therefore, the glass "appears" when user mouses over it. --> <Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" /> <!-- Makes the text slightly blurry as though you were looking at it through blurry glass. --> <Setter Property="ContentPresenter.BitmapEffect" TargetName="myContentPresenter"> <Setter.Value> <BlurBitmapEffect Radius="1" /> </Setter.Value> </Setter> </Trigger> <!-- Set properties when button has focus. --> <Trigger Property="IsFocused" Value="true"> <Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" /> <Setter Property="Rectangle.Stroke" TargetName="outerRectangle" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> <Setter Property="Rectangle.Opacity" Value="1" TargetName="glassCube" /> </Trigger> </ControlTemplate.Triggers>
Drücken Sie F5, um die Anwendung auszuführen, und klicken Sie auf eine der Schaltflächen. Beachten Sie, dass die Schaltfläche nach dem Klicken hervorgehoben bleibt, da sie weiterhin den Fokus hat. Wenn Sie auf eine andere Schaltfläche klicken, wechselt der Fokus von der letzten Schaltfläche zur neuen Schaltfläche.
Hinzufügen von Animationen für MouseEnterundMouseLeave: Als Nächstes fügen Sie den Triggern einige Animationen hinzu. Fügen Sie das folgende Markup an einer beliebigen Stelle innerhalb des
ControlTemplate.Triggers
-Blocks hinzu.<!-- Animations that start when mouse enters and leaves button. --> <EventTrigger RoutedEvent="Mouse.MouseEnter"> <EventTrigger.Actions> <BeginStoryboard Name="mouseEnterBeginStoryboard"> <Storyboard> <!-- This animation makes the glass rectangle shrink in the X direction. --> <DoubleAnimation Storyboard.TargetName="glassCube" Storyboard.TargetProperty= "(Rectangle.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" By="-0.1" Duration="0:0:0.5" /> <!-- This animation makes the glass rectangle shrink in the Y direction. --> <DoubleAnimation Storyboard.TargetName="glassCube" Storyboard.TargetProperty= "(Rectangle.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" By="-0.1" Duration="0:0:0.5" /> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> <EventTrigger RoutedEvent="Mouse.MouseLeave"> <EventTrigger.Actions> <!-- Stopping the storyboard sets all animated properties back to default. --> <StopStoryboard BeginStoryboardName="mouseEnterBeginStoryboard" /> </EventTrigger.Actions> </EventTrigger>
Das Rechteck mit dem Glaseffekt wird verkleinert, wenn der Mauszeiger über die Schaltfläche bewegt wird, und wieder auf die normale Größe zurückgesetzt, wenn der Zeiger sie verlässt.
Es werden zwei Animationen ausgelöst, wenn der Mauszeiger über die Schaltfläche bewegt wird (das MouseEnter-Ereignis wird ausgelöst). Diese Animationen verkleinern das Glasrechteck entlang der X- und Y-Achse. Beachten Sie die Eigenschaften der DoubleAnimation-Elemente Duration und By. Die Duration gibt an, dass die Animation eine halbe Sekunde langt ausgeführt wird, und By gibt an, dass das Glas um 10 % verkleinert wird.
Der zweite Ereignisauslöser (MouseLeave) beendet einfach die erste Animation. Wenn Sie ein Storyboard beenden, werden alle animierten Eigenschaften auf ihre Standardwerte zurückgesetzt. Wenn die Benutzer*innen also den Mauszeiger von der Schaltfläche weg bewegen, nimmt sie wieder die Form an, die sie vor dem Bewegen des Mauszeigers auf die Schaltfläche hatte. Weitere Informationen zu Animationen finden Sie unter Übersicht über Animationen.
Hinzufügen einer Animation beim Klicken auf die Schaltfläche: Der letzte Schritt besteht darin, einen Trigger hinzuzufügen, wenn Benutzer*innen auf die Schaltfläche klicken. Fügen Sie das folgende Markup an einer beliebigen Stelle innerhalb des
ControlTemplate.Triggers
-Blocks hinzu:<!-- Animation fires when button is clicked, causing glass to spin. --> <EventTrigger RoutedEvent="Button.Click"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="glassCube" Storyboard.TargetProperty= "(Rectangle.RenderTransform).(TransformGroup.Children)[1].(RotateTransform.Angle)" By="360" Duration="0:0:0.5" /> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger>
Drücken Sie F5, um die Anwendung auszuführen, und klicken Sie auf eine der Schaltflächen. Wenn Sie auf eine Schaltfläche klicken, dreht sich das Glasrechteck.
Zusammenfassung
In dieser exemplarischen Vorgehensweise haben Sie die folgenden Aufgaben ausgeführt:
Sie haben als Ziel eines Style einen Objekttyp (Button) festgelegt.
Sie haben grundlegende Eigenschaften der Schaltflächen in der gesamten Anwendung mithilfe von Style festgelegt.
Sie haben Ressourcen wie Farbverläufe erstellt, die für Eigenschaftswerte der Style-Setter verwendet werden.
Sie haben das Aussehen von Schaltflächen in der gesamten Anwendung angepasst, indem Sie eine Vorlage auf die Schaltflächen angewandt haben.
Sie haben das Verhalten der Schaltflächen als Reaktion auf Benutzeraktionen (z. B. MouseEnter, MouseLeave und Click) mit Animationseffekten angepasst.
Siehe auch
.NET Desktop feedback