Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az útmutató célja, hogy megismerje, hogyan hozhat létre animált gombot a Windows Presentation Foundation (WPF) alkalmazásokban való használatra. Ez az útmutató stílusokat és sablonokat használ egy testre szabott gomberőforrás létrehozásához, amely lehetővé teszi a kód újrafelhasználását és a gomblogika elválasztását a gombdeklarációtól. Ez az útmutató teljes egészében extensible Application Markup Language (XAML) nyelven íródott.
Fontos
Ez az útmutató végigvezeti az alkalmazás létrehozásának lépésein az Extensible Application Markup Language (XAML) Visual Studióba való beírásával vagy másolásával és beillesztésével. Ha szeretné megtudni, hogyan hozhatja létre ugyanazt az alkalmazást tervezővel, olvassa el Gomb létrehozása a Microsoft Expression Blendhasználatával című témakört.
Az alábbi ábrán a kész gombok láthatók.
Egyszerű gombok létrehozása
Először hozzunk létre egy új projektet, és adjunk hozzá néhány gombot az ablakhoz.
Új WPF-projekt létrehozása és gombok hozzáadása az ablakhoz
Indítsa el a Visual Studiót.
Új WPF-projekt létrehozása: A Fájl menüben mutasson a Újelemre, majd kattintson a projektelemre. Keresse meg a Windows-alkalmazás (WPF) sablont, és nevezze el az "AnimatedButton" projektet. Ez létrehozza az alkalmazás csontvázát.
Alapszintű alapértelmezett gombok hozzáadása: Az útmutatóhoz szükséges összes fájlt a sablon biztosítja. A Window1.xaml fájl megnyitásához kattintson rá duplán a Megoldáskezelőben. Alapértelmezés szerint van egy Grid elem a Window1.xaml-ben. Távolítsa el a Grid elemet, és adjon hozzá néhány gombot az XAML (Extensible Application Markup Language, XAML) laphoz az alábbi kiemelt kód beírásával vagy másolásával és beillesztésével a Window1.xaml fájlba:
<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>Nyomja le az F5 billentyűt az alkalmazás futtatásához; a következő ábrához hasonló gomboknak kell megjelennie.
Most, hogy létrehozta az alapvető gombokat, befejezte a Windows1.xaml fájlban való munkát. Az útmutató további része az app.xaml fájlra, a stílusok meghatározására és a gombok sablonjára összpontosít.
Alaptulajdonságok beállítása
Ezután állítsunk be néhány tulajdonságot ezeken a gombokon a gomb megjelenésének és elrendezésének szabályozásához. Ahelyett, hogy külön-külön állít be tulajdonságokat a gombokon, erőforrásokat fog használni a teljes alkalmazás gombtulajdonságainak meghatározásához. Az alkalmazáserőforrások fogalmilag hasonlóak a weblapok külső kaszkádolt stíluslapjaihoz (CSS); az erőforrások azonban sokkal hatékonyabbak, mint a kaszkádolt stíluslapok (CSS), ahogy az útmutató végére látni fogja. További információ az erőforrásokról: XAML-erőforrások.
Stílusok használata a gombok alaptulajdonságainak beállításához
Application.Resources-blokk definiálása: Nyissa meg az app.xaml fájlt, és adja hozzá a következő kiemelt jelölést, ha az még nincs megadva:
<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>Az erőforrás hatókörét az határozza meg, hogy hol definiálja az erőforrást. Az app.xaml fájlban lévő
Application.Resourceserőforrások definiálása lehetővé teszi, hogy az erőforrás az alkalmazás bármely pontjáról használható legyen. Az erőforrások hatókörének meghatározásáról további információt az XAML-erőforrások című témakörben talál.Stílus létrehozása és alaptulajdonságértékek definiálása: Adja hozzá a következő korrektúrát a
Application.Resourcesblokkhoz. Ez a korrektúra létrehoz egy Style-t, amely az alkalmazás összes gombjára vonatkozik, a gombok Width értékét 90-re, a Margin értékét pedig 10-re állítva.<Application.Resources> <Style TargetType="Button"> <Setter Property="Width" Value="90" /> <Setter Property="Margin" Value="10" /> </Style> </Application.Resources>A TargetType tulajdonság azt határozza meg, hogy a stílus minden Buttontípusú objektumra vonatkozik. Minden Setter a Styleeltérő tulajdonságértéket állít be. Ezért ezen a ponton az alkalmazás minden gombja 90 szélességű és 10 margóval rendelkezik. Ha az alkalmazás futtatásához nyomja le az F5 billentyűt, az alábbi ablak jelenik meg.
A stílusokkal sokkal többet is elvégezhet, többek között többféleképpen finomhangolhatja a megcélzott objektumokat, összetett tulajdonságértékeket adhat meg, vagy akár stílusokat is használhat más stílusok bemeneteként. További információ: Stílus és sablonkészítés.
Stílustulajdonság értékének beállítása erőforrásra: Az erőforrások egyszerű módot tesznek lehetővé a gyakran definiált objektumok és értékek újrafelhasználására. Különösen hasznos összetett értékeket definiálni erőforrások használatával, hogy a kód modulárisabb legyen. Adja hozzá az alábbi kiemelt jelölést az app.xaml-hez.
<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>Közvetlenül a
Application.Resourcesblokk alatt létrehozott egy "GrayBlueGradientBrush" nevű erőforrást. Ez az erőforrás vízszintes színátmenetet határoz meg. Ez az erőforrás az alkalmazás bármely pontjáról használható tulajdonságértékként, beleértve a Background tulajdonság gombstílus-beállítójában is. Most az összes gomb rendelkezik a színátmenet Background tulajdonságértékével.Nyomja le az F5 billentyűt az alkalmazás futtatásához. Úgy kell kinéznie, mint a következő.
A gomb megjelenését meghatározó sablon létrehozása
Ebben a szakaszban létrehoz egy sablont, amely testre szabja a gomb megjelenését (bemutatóját). A gombbemutató több objektumból áll, köztük téglalapokból és más összetevőkből, hogy egyedi megjelenést kölcsönözzen a gombnak.
Eddig a gombok alkalmazásbeli megjelenésének szabályozása a gomb tulajdonságainak módosítására korlátozódott. Mi a teendő, ha radikálisabb módosításokat szeretne végezni a gomb megjelenésén? A sablonok hatékony vezérlést tesznek lehetővé egy objektum bemutatója felett. Mivel a sablonok stílusokon belül is használhatók, sablont alkalmazhat az összes objektumra, amelyekre a stílus vonatkozik (ebben az útmutatóban a gombot).
A sablon használata a gomb megjelenésének meghatározásához
A sablon beállítása: Mivel az Button vezérlőelemeknek van Template tulajdonságuk, a sablon tulajdonság értékét ugyanúgy meghatározhatja, mint a többi tulajdonságértéket, ahogy azt korábban a Style esetében tettük egy Setterhasználatával. Adja hozzá a következő kiemelt jelölést a gombstílushoz.
<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>Alter button presentation: Ezen a ponton meg kell határoznia a sablont. Adja hozzá az alábbi kiemelt jelöléseket. Ez a jelölés két Rectangle elemet határoz meg lekerekített élekkel, majd egy DockPanelelemet. A DockPanel a gomb ContentPresenter üzemeltetésére szolgál. Egy ContentPresenter megjeleníti a gomb tartalmát. Ebben az útmutatóban a tartalom szöveg ("1. gomb", "2. gomb", "3. gomb"). Az összes sablonösszetevő (a téglalapok és a DockPanel) egy Gridbelül vannak elhelyezve.
<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>Nyomja le az F5 billentyűt az alkalmazás futtatásához. Úgy kell kinéznie, mint a következő.
Üveghatás hozzáadása a sablonhoz: Ezután hozzáadja az üveget. Először hozzon létre néhány erőforrást, amelyek egy üvegátmenetes effektust hoznak létre. Adja hozzá ezeket a színátmenetes erőforrásokat a
Application.Resourcesblokkon belül:<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. -->Ezek az erőforrások a téglalap Fill-ként használatosak, amelyet a gombsablon Grid-jébe illesztünk be. Adja hozzá a következő kiemelt jelölést a sablonhoz.
<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>Figyelje meg, hogy a "glassCube" Opacity tulajdonságú téglalap
x:Nameértéke 0, így amikor futtatja a mintát, nem látható a tetején az átlátszó téglalap. Ennek az az oka, hogy később eseményindítókat adunk hozzá a sablonhoz, amikor a felhasználó használja a gombot. Az Opacity érték 1 értékre való módosításával és az alkalmazás futtatásával azonban láthatja, hogyan néz ki most a gomb. Lásd az alábbi ábrát. A következő lépés előtt állítsa vissza a Opacity-t 0-ra.
Gomb interaktivitás létrehozása
Ebben a szakaszban tulajdonság-eseményindítókat és eseményindítókat fog létrehozni a tulajdonságértékek módosításához, és animációkat futtat a felhasználói műveletekre válaszul, például az egérmutatót a gombra mozgatva és kattintással.
Az interaktivitás (egérmutató, egérút, kattintás stb.) hozzáadásának egyszerű módja az eseményindítók sablonon vagy stíluson belüli definiálása.
Triggerlétrehozásához meg kell adnia egy "feltétel" tulajdonságot, például: A gomb IsMouseOver tulajdonság értéke megegyezik true. Ezután definiálhatja azokat a beállítókat (műveleteket), amelyek akkor történnek, amikor az eseményindító feltétel teljesül.
Gomb interaktivitásának létrehozása
Sablonindítók hozzáadása: A kiemelt jelölések hozzáadása a sablonhoz.
<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>Tulajdonság triggerek hozzáadása: A kiemelt jelöléskód hozzáadása a
ControlTemplate.Triggersblokkhoz:<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/>Nyomja le az F5 billentyűt az alkalmazás futtatásához, és tekintse meg az effektust, amikor az egérmutatót a gombok fölé viszi.
Fókusz eseményindító hozzáadása: Következő lépésként hozzáadunk néhány hasonló beállítót az eset kezeléséhez, ha a gomb fókuszban van (például miután a felhasználó rákattint rá).
<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>Nyomja le az F5 billentyűt az alkalmazás futtatásához, és kattintson az egyik gombra. Figyelje meg, hogy a gomb a kattintás után is kiemelt marad, mert még mindig fókuszban van. Ha egy másik gombra kattint, az új gomb fókuszba kerül, míg az utolsó elveszíti azt.
MouseEnter ésMouseLeaveanimációinak hozzáadása: Ezután hozzáadunk néhány animációt az eseményindítókhoz. Adja hozzá az alábbi jelölést a
ControlTemplate.Triggersblokkba.<!-- 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>Az üveg téglalap kisebb lesz, amikor az egérmutató a gomb fölé mozdul, és visszaáll eredeti méretére, amikor a mutató távozik.
Két animáció aktiválódik, amikor az egérmutató átmegy a gombon (MouseEnter esemény fel van emelve). Ezek az animációk az X és az Y tengely mentén zsugorítják az üveg téglalapot. Figyelje meg a tulajdonságokat a DoubleAnimation elemeken – Duration és By. A Duration azt határozza meg, hogy az animáció fél másodperc alatt történik, By pedig azt adja meg, hogy az üveg 10%kicsinyedik.
A második eseményindító (MouseLeave) egyszerűen leállítja az elsőt. Ha leállítja a Storyboard, az összes animált tulajdonság visszatér az alapértelmezett értékekhez. Ezért amikor a felhasználó áthelyezi az egérmutatót a gombról, a gomb visszakerül az addigihoz, mint azelőtt, hogy az egérmutató a gomb fölé került volna. További információ az animációkról: Animáció áttekintése.
Animáció hozzáadása a gombra kattintáskor: Az utolsó lépés egy eseményindító hozzáadása, amikor a felhasználó a gombra kattint. Adja hozzá a következő jelölést a
ControlTemplate.Triggersblokkon belül:<!-- 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>Az alkalmazás futtatásához nyomja le az F5 billentyűt, majd kattintson az egyik gombra. Ha egy gombra kattint, az üveg téglalapja forog.
Összefoglalás
Ebben az útmutatóban a következő gyakorlatokat hajtotta végre:
A teljes alkalmazásban a gombok alapvető tulajdonságainak szabályozása a Stylehasználatával történt.
Olyan erőforrásokat hozott létre, mint a színátmenetek, amelyeket a Style-beállítók tulajdonságértékeihez használhat.
Testre szabta a gombok megjelenését a teljes alkalmazásban, ha sablont alkalmaz a gombokra.
A gombok egyéni viselkedése az animációs effektusokat tartalmazó felhasználói műveletekre (például MouseEnter, MouseLeaveés Click) reagálva.
Lásd még
.NET Desktop feedback