WPF界面設計技巧(2)—自定義漂亮的按鈕樣式

上次做了個很酷的不規則窗體,這次我們來弄點好看的按鈕出來,此次將采用純代碼來設計按鈕樣式,不需要 Microsoft Expression Design 輔助了。

?

首先打開 Microsoft Visual Studio 2008 ,新建一個WPF項目,在上面隨便放幾個按鈕:

?

?

然后給各個按鈕設置不同的背景顏色:

?

?

設置好之后就是這樣啦:

?

?

然后我們就開始在 App.xaml 文件中定義按鈕樣式了:

?

?

定義的樣式代碼如下:

?

Code
<Application?x:Class="WPFButton.App"
????xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
????xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
????StartupUri
="Window1.xaml">
????
<Application.Resources>
????????
<!--定義按鈕樣式-->
????????
<Style?TargetType="Button">
????????????
<Setter?Property="Foreground"?Value="Black"/>
????????????
<!--修改模板屬性-->
????????????
<Setter?Property="Template">
????????????????
<Setter.Value>
????????????????????
<!--控件模板-->
????????????????????
<ControlTemplate?TargetType="Button">
????????????????????????
<!--背景色-->
????????????????????????
<Border?x:Name="back"?Opacity="0.8"?CornerRadius="3">
????????????????????????????
<Border.BitmapEffect>
????????????????????????????????
<OuterGlowBitmapEffect?Opacity="0.7"?GlowSize="0"?GlowColor="{Binding?RelativeSource={RelativeSource?TemplatedParent},?Path=(Button.Background).(SolidColorBrush.Color)}"?/>
????????????????????????????
</Border.BitmapEffect>
????????????????????????????
<Border.Background>
????????????????????????????????
<LinearGradientBrush?StartPoint="0,0"?EndPoint="0,1.5">
????????????????????????????????????
<GradientBrush.GradientStops>
????????????????????????????????????????
<GradientStopCollection>
????????????????????????????????????????????
<GradientStop?Color="{Binding?RelativeSource={RelativeSource?TemplatedParent},?Path=(Button.Background).(SolidColorBrush.Color)}"?Offset="0"/>
????????????????????????????????????????????
<GradientStop?Color="{Binding?RelativeSource={RelativeSource?TemplatedParent},?Path=(Button.Background).(SolidColorBrush.Color)}"?Offset="0.4"/>
????????????????????????????????????????????
<GradientStop?Color="#FFF"?Offset="1"/>
????????????????????????????????????????
</GradientStopCollection>
????????????????????????????????????
</GradientBrush.GradientStops>
????????????????????????????????
</LinearGradientBrush>
????????????????????????????
</Border.Background>
????????????????????????????
<!--前景色及邊框-->
????????????????????????????
<Border?x:Name="fore"?BorderThickness="1"?CornerRadius="3"?BorderBrush="#5555">
????????????????????????????????
<Border.Background>
????????????????????????????????????
<LinearGradientBrush?StartPoint="0,0"?EndPoint="0,1">
????????????????????????????????????????
<GradientBrush.GradientStops>
????????????????????????????????????????????
<GradientStopCollection>
????????????????????????????????????????????????
<GradientStop?Color="#6FFF"?Offset="0.5"/>
????????????????????????????????????????????????
<GradientStop?Color="#1111"?Offset="0.51"/>
????????????????????????????????????????????
</GradientStopCollection>
????????????????????????????????????????
</GradientBrush.GradientStops>
????????????????????????????????????
</LinearGradientBrush>
????????????????????????????????
</Border.Background>
????????????????????????????????
<!--按鈕內容-->
????????????????????????????????
<ContentPresenter?x:Name="content"?HorizontalAlignment="Center"?VerticalAlignment="Center"?Content="{TemplateBinding??Content}">
????????????????????????????????????
<ContentPresenter.BitmapEffect>
????????????????????????????????????????
<DropShadowBitmapEffect?Color="#000"?Direction="-90"?ShadowDepth="2"?Softness="0.1"?Opacity="0.3"?/>
????????????????????????????????????
</ContentPresenter.BitmapEffect>
????????????????????????????????
</ContentPresenter>
????????????????????????????
</Border>
????????????????????????
</Border>
????????????????????????
<!--觸發器-->
????????????????????????
<ControlTemplate.Triggers>
????????????????????????????
<!--鼠標移入移出-->
????????????????????????????
<Trigger?Property="IsMouseOver"?Value="True">
????????????????????????????????
<Trigger.EnterActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?To="6"?Duration="0:0:0.2"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#AFFF"?BeginTime="0:0:0.2"?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#3FFF"?BeginTime="0:0:0.2"?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.EnterActions>
????????????????????????????????
<Trigger.ExitActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.2"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.ExitActions>
????????????????????????????
</Trigger>
????????????????????????????
<!--按鈕按下彈起-->
????????????????????????????
<Trigger?Property="IsPressed"?Value="True">
????????????????????????????????
<Trigger.EnterActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?To="3"?Duration="0:0:0.1"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#3AAA"?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#2111"?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.EnterActions>
????????????????????????????????
<Trigger.ExitActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.ExitActions>
????????????????????????????
</Trigger>
????????????????????????????
<!--按鈕失效-->
????????????????????????????
<Trigger?Property="IsEnabled"?Value="False">
????????????????????????????????
<Setter?Property="Foreground"?Value="#B444"/>
????????????????????????????????
<Trigger.EnterActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?To="0"?Duration="0:0:0.3"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<DoubleAnimation?To="1"?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Opacity)"?/>
????????????????????????????????????????????
<DoubleAnimation?To="-135"?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Direction)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#FFF"?Duration="0:0:0.3"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#D555"?Duration="0:0:0.3"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#CEEE"?Duration="0:0:0.3"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#CDDD"?Duration="0:0:0.3"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.EnterActions>
????????????????????????????????
<Trigger.ExitActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Opacity)"?/>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Direction)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.ExitActions>
????????????????????????????
</Trigger>
????????????????????????
</ControlTemplate.Triggers>
????????????????????
</ControlTemplate>
????????????????
</Setter.Value>
????????????
</Setter>
????????
</Style>
????
</Application.Resources>
</Application>

?

看了先不要頭大,我們先看看最終效果,然后回過頭來再解釋代碼:

?

?

這是常規樣式

?

?

這個是鼠標移到上面時的樣式

?

?

?

這個是鼠標點擊時的樣式

?

?

還有就是按鈕失效時的樣式

?

?

效果還算不錯吧,下面來講解代碼嘍,頭暈的同學可以現在就收拾東西回家了哈。

?

?

我們先來看這個命名為“back”的 Border 元素,它用它的 Background 屬性充當了整個按鈕的背景色。

?

?

<Border.Background>
????????????????????????????????
<LinearGradientBrush?StartPoint="0,0"?EndPoint="0,1.5">
????????????????????????????????????
<GradientBrush.GradientStops>
????????????????????????????????????????
<GradientStopCollection>
????????????????????????????????????????????
<GradientStop?Color="{Binding?RelativeSource={RelativeSource?TemplatedParent},?Path=(Button.Background).(SolidColorBrush.Color)}"?Offset="0"/>
????????????????????????????????????????????
<GradientStop?Color="{Binding?RelativeSource={RelativeSource?TemplatedParent},?Path=(Button.Background).(SolidColorBrush.Color)}"?Offset="0.4"/>
????????????????????????????????????????????
<GradientStop?Color="#FFF"?Offset="1"/>
????????????????????????????????????????
</GradientStopCollection>
????????????????????????????????????
</GradientBrush.GradientStops>
????????????????????????????????
</LinearGradientBrush>
????????????????????????????
</Border.Background>

?

其背景所用的是一個漸變筆刷,起始值和中間值都是引用的按鈕本身的背景色,就是我們之前設置過的顏色啦,終止值是白色,這樣通過位置調整,我們可以在按鈕最下部產生一些向白色的過度色彩效果。

?

?

<Border.BitmapEffect>
????????????????????????????????
<OuterGlowBitmapEffect?Opacity="0.7"?GlowSize="0"?GlowColor="{Binding?RelativeSource={RelativeSource?TemplatedParent},?Path=(Button.Background).(SolidColorBrush.Color)}"?/>
????????????????????????????
</Border.BitmapEffect>

?

它的 BitmapEffect 屬性我們設置了一個大小為 0 的外發光效果,平常是看不見這效果的,在這里預先設置好,是為了在鼠標移入、按下時實現動畫使用。

?

?

再來看看這個命名為“fore”的 Border 元素,它實現的是按鈕的邊框和高亮反光效果,我為它設置了一個半透明的黑色1像素邊框,使得這個邊框的色彩可以和背景色混合起來。

?

?

????????????????????????????????<Border.Background>
????????????????????????????????????
<LinearGradientBrush?StartPoint="0,0"?EndPoint="0,1">
????????????????????????????????????????
<GradientBrush.GradientStops>
????????????????????????????????????????????
<GradientStopCollection>
????????????????????????????????????????????????
<GradientStop?Color="#6FFF"?Offset="0.5"/>
????????????????????????????????????????????????
<GradientStop?Color="#1111"?Offset="0.51"/>
????????????????????????????????????????????
</GradientStopCollection>
????????????????????????????????????????
</GradientBrush.GradientStops>
????????????????????????????????????
</LinearGradientBrush>
????????????????????????????????
</Border.Background>

?

它的背景同樣采用的漸變筆刷,起始值和終止值的位置幾乎貼在一起,從而形成比較鮮明的反光度對比。

?

?

ContentPresenter 元素用于呈現按鈕原本的內容,對于按鈕來說就是按鈕上的文字了,當然也可能會存在圖片或其它東西。

?

?

????????????????????????????????????<ContentPresenter.BitmapEffect>
????????????????????????????????????????
<DropShadowBitmapEffect?Color="#000"?Direction="-90"?ShadowDepth="2"?Softness="0.1"?Opacity="0.3"?/>
????????????????????????????????????
</ContentPresenter.BitmapEffect>

?

我為之加了一個不太明顯的陰影濾鏡以增強顯示效果。

?

?

剩下的就是些可愛又該死的 Trigger ,我們通過這些觸發器來改變按鈕在不同狀態時的外觀。

?

?

????????????????????????????<!--鼠標移入移出-->
????????????????????????????
<Trigger?Property="IsMouseOver"?Value="True">
????????????????????????????????
<Trigger.EnterActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?To="6"?Duration="0:0:0.2"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#AFFF"?BeginTime="0:0:0.2"?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#3FFF"?BeginTime="0:0:0.2"?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.EnterActions>
????????????????????????????????
<Trigger.ExitActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.2"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.2"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.ExitActions>
????????????????????????????
</Trigger>

?

在鼠標移入按鈕時,我依次創建了改變外發光效果大小、改變上部反光區域顏色、改變下部反光區域顏色的動畫,這里的要點就在于“Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"”屬性設置語句,琢磨一下你就能看出這是對屬性路徑的描述,只不過它們寫起來和看起來都很讓人生氣。

?

?

????????????????????????????<!--按鈕按下彈起-->
????????????????????????????
<Trigger?Property="IsPressed"?Value="True">
????????????????????????????????
<Trigger.EnterActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?To="3"?Duration="0:0:0.1"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#3AAA"?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#2111"?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.EnterActions>
????????????????????????????????
<Trigger.ExitActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.ExitActions>
????????????????????????????
</Trigger>

?

按下和彈起按鈕時,我們做了相似的動畫改變,與前面相比只是數值略微不同。

?

?

????????????????????????????<!--按鈕失效-->
????????????????????????????
<Trigger?Property="IsEnabled"?Value="False">
????????????????????????????????
<Setter?Property="Foreground"?Value="#B444"/>
????????????????????????????????
<Trigger.EnterActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?To="0"?Duration="0:0:0.3"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<DoubleAnimation?To="1"?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Opacity)"?/>
????????????????????????????????????????????
<DoubleAnimation?To="-135"?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Direction)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#FFF"?Duration="0:0:0.3"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#D555"?Duration="0:0:0.3"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#CEEE"?Duration="0:0:0.3"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?To="#CDDD"?Duration="0:0:0.3"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.EnterActions>
????????????????????????????????
<Trigger.ExitActions>
????????????????????????????????????
<BeginStoryboard>
????????????????????????????????????????
<Storyboard>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="back"?Storyboard.TargetProperty="(Border.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)"?/>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Opacity)"?/>
????????????????????????????????????????????
<DoubleAnimation?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Direction)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="content"?Storyboard.TargetProperty="(ContentPresenter.BitmapEffect).(DropShadowBitmapEffect.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[0].(GradientStop.Color)"?/>
????????????????????????????????????????????
<ColorAnimation?Duration="0:0:0.1"?Storyboard.TargetName="fore"?Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Color)"?/>
????????????????????????????????????????
</Storyboard>
????????????????????????????????????
</BeginStoryboard>
????????????????????????????????
</Trigger.ExitActions>
????????????????????????????
</Trigger>

?

當按鈕失效時,我要改變很多東西,首先將文字顏色設為灰色,然后依次創建了改變外發光效果大小、改變內容陰影效果不透明度、改變內容陰影效果角度、改變內容陰影效果顏色、改變按鈕邊框顏色、改變上部反光區域顏色、改變下部反光區域顏色的動畫。

?

這里將先前對內容應用的陰影效果徹底改變,使之產生凹陷的效果。

?

?

好了,到這里就下課啦,文章有點冗長了,但應該對新手很有幫助,老鳥估計現在已經夢游仙境了吧。

?

源文件下載

轉載于:https://www.cnblogs.com/SkyD/archive/2008/07/15/1243043.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ropgadgets與ret2syscall技術原理

程序&#xff1a; #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/syscall.h> void exploit() { system("/bin/sh"); } void func() { char str[0x20]; read(0,str,0x50); } int…

uboot load address、entry point、 bootm address以及kernel運行地址的意義及聯系

按各地址起作用的順序&#xff0c;uboot引導linux內核啟動涉及到以下地址&#xff1a; load address&#xff1a;entry point&#xff1a; 這兩個地址是mkimage時指定的bootm address&#xff1a;bootm為uboot的一個命令&#xff0c;以此從address啟動kernelkernel運行地址&…

Java——集合(Map集合的兩種迭代)

一&#xff0c;Map集合的第一種迭代 Map集合的第一種迭代&#xff0c;通過get(key)方法&#xff0c;根據鍵去獲取值 package com.wsq.map;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Demo2_Iterator { …

如何使用兩個堆棧實現隊列_使用兩個隊列實現堆棧

如何使用兩個堆棧實現隊列Stack and Queue at a glance... 堆疊和排隊一目了然... Stack: 堆棧&#xff1a; The stack is an ordered list where insertion and deletion are done from the same end, top. The last element that entered first is the first one to be del…

接口pk抽象類

作為開發者&#xff0c;誰從來沒有陷入過周而復始地爭論應該是使用接口還是抽象類&#xff1f;這是一場永無休止的爭論&#xff0c;不同陣營的人總是堅定地堅持自己的立場。應當使用接口還是抽象類&#xff1f;對于初學者來說那更是滿頭霧水。這個問題應該考慮一下幾個因素&…

匯編shr命令

右移命令 比如&#xff1a; mov eax,10 shr eax,0x2上面的命令是將eax的值右移兩位&#xff0c;怎么左移呢&#xff1f;首先將eax的值轉為二進制10------》1010&#xff0c;然后右移兩位變成10&#xff0c;所以執行為shr命令&#xff0c;eax的值為十進制的2

iBatis入門和開發環境搭建

iBatis 的優缺點&#xff1a; 優點&#xff1a; 1、 減少代碼量&#xff0c;簡單&#xff1b; 2、 性能增強&#xff1b; 3、 Sql 語句與程序代碼分離&#xff1b; 4、 增強了移植性&#xff1b; 缺點&#xff1a; 1、 和Hibernate 相比&#xff0c;sql 需要自己寫&#x…

Python | 程序以字符串長度打印單詞

Given a string and we have to split the string into words and also print the length of the each word in Python. 給定一個字符串&#xff0c;我們必須將字符串拆分為單詞&#xff0c;并在Python中打印每個單詞的長度。 Example: 例&#xff1a; Input:str "Hell…

Java——遞歸練習

#練習一&#xff1a;從鍵盤接收一個文件夾路徑&#xff0c;統計該文件夾大小 ###分析&#xff1a; ####每句話相當與每一個要求&#xff0c;每一個要求用一個方法去實現 第一個方法 * getDir()* 第一個要求&#xff1a;從鍵盤接收一個文件夾路徑* 1&#xff0c;創建鍵盤錄入對…

C# 里怎樣得到當前執行的函數名,當前代碼行,源代碼文件名。

得到函數名&#xff1a; System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代碼行&#xff0c;源代碼文件名&#xff1a; StackTrace st new StackTrace(new StackFrame(true)); Console…

PHP中單引號和雙引號的區別

0x01 單引號 單引號里面的內容不會被解釋&#xff0c;不管什么內容&#xff0c;都當做字符串處理 <?php$abc1234; $stradc$abc; echo $str;輸出 0x02 雙引號 雙引號里面的內容會被解釋&#xff0c;像一些換行&#xff08;\n)、數據元素等都會被解釋 <?php$abc1234;…

Eclipse 代碼提示無效的解決方法

代碼提示一般有兩種形勢1、點提示無效經常打一個點就能調出該對象可選的方法列表。哪天不靈了&#xff0c;可以這樣解決&#xff1a;window->Preferences->Java->Editor->Content Assist->Advanced 上面的選項卡Select the proposal kinds contained in the de…

getdate 日期間隔_日期getDate()方法以及JavaScript中的示例

getdate 日期間隔JavaScript Date getDate()方法 (JavaScript Date getDate() method) getDate() method is a Dates class method and it is used to get the current day of the month. getDate()方法是Date的類方法&#xff0c;用于獲取當月的當前日期。 It accepts nothin…

關閉頁面時執行“退出”的解決方案

在有些應用中我們需要實時的更新站點用戶是否在線的狀態。比如一些論壇里的在線成員實時顯示&#xff0c;或基于網頁的聊天、會議系統等。這種情況下&#xff0c;如果用戶點擊“退出”按鈕或鏈接&#xff0c;我們將之行一系列后臺操作&#xff0c;將該用戶標識成off line狀態&a…

Java——多線程實現的三種方式

創建新執行線程有三種方法。 第一種方法是將類聲明為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。接下來可以分配并啟動該子類的實例。 例如&#xff0c;計算大于某一規定值的質數的線程可以寫成&#xff1a; class PrimeThread extends Thread {long minPrime;Pri…

python網絡編程---TCP客戶端

0x01 環境 python2、 pycharm 0x02 程序 # -*- coding:UTF-8 -*- import sockettarget_hostwww.baidu.com tarfet_port80target_hostlocalhost target_port3345 dataABCDEF# 創建一個socket對象 client socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 連接客戶端 clien…

c#枚舉數字轉枚舉_C#枚舉能力問題和解答 套裝4

c#枚舉數字轉枚舉1) What is the correct output of given code snippets in C#.NET? using System;class program{enum emp_salary : int{emp1 10000,emp2 15000,emp4 20000}static void Main(string[] args){int sal (int)emp_salary.emp2;Console.WriteLine(sal);}}100…

Java——匿名內部類實現線程的兩種方式

package com.yy.thread;public class Demo4_Thread {public static void main(String[] args) {demo1(); //匿名內部類&#xff0c;第一種&#xff0c;繼承Threaddemo2(); //匿名內部類&#xff0c;第二種&#xff0c;實現Runnable接口 }private static void…

zlib1.2.5的編譯

zlib1.2.5沒有了1.2.4的vc6工程&#xff0c;只好使用命令行編譯。通過win32/Makefile.msc發現有4種編譯方式&#xff0c;如下&#xff1a;# Usage:# nmake -f win32/Makefile.msc (standard build)# nmake -f win32/Makefile.msc LOC-DFOO …

python網絡編程--UDP客戶端

0x01 環境 python、pycharm 0x02 程序 # -*- coding:utf-8 -*-import sockettarget_host127.0.0.1 target_part80#創建一個socket對象 client socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#發送一些數據 client.sendto(AAAAAA,(target_host,target_part))#接收到的消息 …