在WindowsForm中可以利用WindowsApi函數AnimateWindow(Inptr hwd,int dwTime,int dwFlags)實作窗體的動畫顯示和淡出,但是它的樣式十分少,且效果不好,而WPF引入了動畫以後,可以自定義很炫的動畫,增強了程式的視覺效果,實作它的一般步驟為,設定窗體透明度等相關屬性,為動畫準備;設定窗體Content的變化屬性;添加動畫顯資源;綁定動畫觸發事件;具體如下。
1、設定窗體透明度等相關屬性
<Windows:................
Name="WDGoto"
WindowStyle="None" <!-- 無邊框窗體,因為邊框不支援動畫-->
Background="Transparent" <!-- 背景透明,因為最後動畫顯示的是窗體的Content是以要把窗體背景設為透明,不然會影響效果-->
AllowsTransparency="True"> <!-- 作用同上-->
2、設定窗體Content RenderTransform變換屬性
RenderTransform裡設定的内容即是動畫時要連續改變的量
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform CenterX="100" CenterY="50"></ScaleTransform>
<!--縮放中心為100,50。RenderTransform.Children[0]-->
<RotateTransform CenterX="100" CenterY="50"></RotateTransform>
<!--旋轉中心為100,50。RenderTransform.Children[1]-->
</TransformGroup>
</Grid.RenderTransform>
這裡窗體的Content是一個Grid,是其它的亦可
3、添加動畫資源
動畫樣式很多,這裡隻接受旋轉顯示和關閉兩種
<Window.Resources>
<!--原始旋轉出來樣例-->
<Storyboard x:Key="showDW"> <!--故事闆,即協同動畫-->
<DoubleAnimation Storyboard.TargetName="grid1" <!--故事闆目标元素,這裡的窗體的Content對象Grid,如果是Canvas等其它的也可以,不過TargetName要一緻-->
Storyboard.TargetProperty="Opacity" <!--透明度動畫-->
From="0.2" To="1" Duration="0:0:2.5">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle" <!--角度動畫-->
From="-90" To="0" Duration="0:0:2" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX" <!--X方向比例動畫,下面一緻,隻是變大變小不同-->
From="0" To="1" Duration="0:0:2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY" <!--Y方向比例動畫,下面一緻,隻是變大變小不同-->
From="0" To="1" Duration="0:0:2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0.98" BeginTime="0:0:2" Duration="0:0:0.05"
DecelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0.98" BeginTime="0:0:2" Duration="0:0:0.05"
DecelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="1" BeginTime="0:0:2.05" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="1" BeginTime="0:0:2.05" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
<!--原始的旋轉回去樣例-->
<Storyboard x:Key="closeDW">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
To="360" Duration="0:0:1.5" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:3">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0" Duration="0:0:1.5" AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0" Duration="0:0:1.5" AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
</Window.Resources>
4、動畫觸發設定
<Window.Triggers>
<!--設定窗體的事件觸發-->
<EventTrigger SourceName="WDGoto" RoutedEvent="Window.Loaded"><!--SourceName為觸發源,這裡與窗體名稱一緻,觸發事件是Loaded事件-->
<BeginStoryboard Name="showQueryCanvasStoryboard2"
Storyboard="{StaticResource showDW}"> <!--綁定顯示窗體動畫-->
</BeginStoryboard>
</EventTrigger>
<EventTrigger SourceName="button1" RoutedEvent="Button.Click"> <!--這裡設定了一個Button控件來關閉窗體,SourceName與其一緻,觸發事件是Click事件-->
<BeginStoryboard Name="closeQueryCanvasStoryboard"
Storyboard="{StaticResource closeDW}"> <!--綁定關閉窗體動畫-->
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
XAML完整代碼如下
<Window x:Class="WpfArcgis.WDGotoXY"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="跳轉到" Height="150" Width="463" Icon="/WpfArcgis;component/Images/L48.bmp" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None" Closing="Window_Closing" Name="WDGoto" Background="Transparent" AllowsTransparency="True">
<Window.Resources>
<!--原始旋轉出來樣例-->
<Storyboard x:Key="showDW">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="Opacity"
From="0.2" To="1" Duration="0:0:2.5">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
From="-90" To="0" Duration="0:0:2" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="0" To="1" Duration="0:0:2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="0" To="1" Duration="0:0:2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0.98" BeginTime="0:0:2" Duration="0:0:0.05"
DecelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0.98" BeginTime="0:0:2" Duration="0:0:0.05"
DecelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="1" BeginTime="0:0:2.05" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="1" BeginTime="0:0:2.05" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
<!--原始的旋轉回去樣例-->
<Storyboard x:Key="closeDW">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
To="360" Duration="0:0:1.5" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:3">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0" Duration="0:0:1.5" AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0" Duration="0:0:1.5" AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
<!--轉出來-->
<Storyboard x:Key="showDW1">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="Opacity"
From="0" To="1" Duration="0:0:0.2">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
From="180" To="0" Duration="0:0:0.2" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="0.2" To="1" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="0.2" To="1" Duration="0:0:0.2"
AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
<!--彈出來-->
<Storyboard x:Key="showDW2">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="0.2" To="0.5" Duration="0:0:0.1" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="0.2" To="0.5" Duration="0:0:0.1" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="0.5" To="1" Duration="0:0:0.1" BeginTime="0:0:0.2" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="0.5" To="1" Duration="0:0:0.1" BeginTime="0:0:0.2">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="1" To="1.2" Duration="0:0:0.1" BeginTime="0:0:0.2" AutoReverse="True" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="1" To="1.2" Duration="0:0:0.1" BeginTime="0:0:0.2" AutoReverse="True">
</DoubleAnimation>
</Storyboard>
<!--轉回去-->
<Storyboard x:Key="closeDW1">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[1].Angle"
To="180" Duration="0:0:0.2" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:0:0.2">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
To="0.2" Duration="0:0:0.2" AccelerationRatio="1">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
To="0.2" Duration="0:0:0.2" AccelerationRatio="1">
</DoubleAnimation>
</Storyboard>
<!--彈回去-->
<Storyboard x:Key="closeDW2">
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="1" To="1.2" Duration="0:0:0.04" AutoReverse="True">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="1" To="1.2" Duration="0:0:0.04" AutoReverse="True">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="1" To="0.5" Duration="0:0:0.04" BeginTime="0:0:0.04" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="1" To="0.5" Duration="0:0:0.04" BeginTime="0:0:0.04">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleX"
From="0.5" To="0" Duration="0:0:0.04" BeginTime="0:0:0.08" >
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="grid1"
Storyboard.TargetProperty="RenderTransform.Children[0].ScaleY"
From="0.5" To="0" Duration="0:0:0.04" BeginTime="0:0:0.08" >
</DoubleAnimation>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<!--設定DW1的事件觸發-->
<!--注意對窗體window的name取為DW1-->
<EventTrigger SourceName="WDGoto" RoutedEvent="Window.Loaded">
<BeginStoryboard Name="showQueryCanvasStoryboard2"
Storyboard="{StaticResource showDW1}">
</BeginStoryboard>
</EventTrigger>
<!--注意對按鈕的name取為button1-->
<EventTrigger SourceName="button1" RoutedEvent="Image.MouseUp">
<BeginStoryboard Name="closeQueryCanvasStoryboard"
Storyboard="{StaticResource closeDW1}">
</BeginStoryboard>
</EventTrigger>
<!--設定button1的事件觸發-->
<!--注意對按鈕的name取為button1-->
</Window.Triggers>
<Grid Name="grid1" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="249*" />
<ColumnDefinition Width="192*" />
</Grid.ColumnDefinitions>
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform CenterX="100" CenterY="50"></ScaleTransform>
<!--縮放中心為100,50。RenderTransform.Children[0]-->
<RotateTransform CenterX="100" CenterY="50"></RotateTransform>
<!--旋轉中心為100,50。RenderTransform.Children[1]-->
</TransformGroup>
</Grid.RenderTransform>
<Label Content="X(經度)" Height="28" HorizontalAlignment="Left" Margin="23,56,0,0" Name="label1" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="79,58,0,0" Name="tbLongitude" VerticalAlignment="Top" Width="120" />
<Label Content="Y(緯度)" Height="28" HorizontalAlignment="Right" Margin="0,53,163,0" Name="label2" VerticalAlignment="Top" Grid.ColumnSpan="2" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="50,58,0,0" Name="tbLatitude" VerticalAlignment="Top" Width="120" Grid.Column="1" />
<Button Content="确定" Height="23" HorizontalAlignment="Left" Margin="185,94,0,0" Name="btnSure" VerticalAlignment="Top" Width="75" Click="btnSure_Click" Grid.ColumnSpan="2" />
<Canvas Height="30" HorizontalAlignment="Stretch" Name="canvas1" VerticalAlignment="Top" Grid.ColumnSpan="2">
<Label Canvas.Left="6" Canvas.Top="0" Content="跳轉到" Height="28" Name="label3" />
<Image Canvas.Right="3" Canvas.Top="3" Height="24" Name="button1" Width="24" Source="/WpfArcgis;component/Images/close.ico" MouseUp="button1_MouseUp">
</Image>
</Canvas>
<Border BorderBrush="Silver" BorderThickness="1" Name="border2" Height="29" HorizontalAlignment="Stretch" VerticalAlignment="Top" Canvas.Top="0" Grid.ColumnSpan="2" Margin="0" />
<Border BorderBrush="Silver" BorderThickness="2" Name="border1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Canvas.Top="0" Grid.ColumnSpan="2" Margin="0" />
</Grid>
</Window>
C#完整代碼如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Threading;
namespace WpfArcgis
{
/// <summary>
/// WDGotoXY.xaml 的互動邏輯
/// </summary>
public partial class WDGotoXY : Window
{
public WDGotoXY()
{
InitializeComponent();
}
private void btnSure_Click(object sender, RoutedEventArgs e)
{
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
}
DispatcherTimer tm = new DispatcherTimer();
void tm_Tick(object sender, EventArgs e)
{
this.Visibility = Visibility.Collapsed;
this.tm.Stop();
this.Close();
}
private void button1_MouseUp(object sender, MouseButtonEventArgs e)
{
tm.Tick += new EventHandler(tm_Tick);
tm.Interval = TimeSpan.FromSeconds(0.2);
tm.Start();
}
}
}