Özellik Animasyon Tekniklerine Genel Bakış
Bu konu başlığı altında, özelliklere animasyon eklemeye yönelik farklı yaklaşımlar açıklanmaktadır: görsel taslaklar, yerel animasyonlar, saatler ve kare başına animasyonlar.
Önkoşullar
Bu konuyu anlamak için Animasyona Genel Bakış'nde açıklanan temel animasyon özelliklerini biliyor olmanız gerekir.
Animasyon Eklemenin Farklı Yolları
Özelliklerin animasyonu için birçok farklı senaryo olduğundan WPF, özelliklerin animasyonu için çeşitli yaklaşımlar sağlar.
Aşağıdaki tablo, her yaklaşım için örnek başına, stillerde, denetim şablonlarında veya veri şablonlarında kullanılıp kullanılamayacağını gösterir; XAML'de kullanılıp kullanılamayacağı; ve yaklaşımın animasyonu etkileşimli olarak denetlemenize olanak verip vermediğini gösterir. "Örnek Başına", stil, denetim şablonu veya veri şablonu yerine doğrudan nesne örneklerine animasyon veya görsel taslak uygulama tekniğini ifade eder.
Animasyon tekniği | Senaryo | XAML'i destekler | Etkileşimli olarak denetlenebilir |
---|---|---|---|
Storyboard animasyonu | Örnek başına, Style, ControlTemplate, DataTemplate | Evet | Evet |
Yerel animasyon | Örnek başına | Hayır | Hayır |
Saat animasyonu | Durum bazında | Hayır | Evet |
Kare başına animasyon | Durum başına | Hayır | Geçerli Değil |
Storyboard Animasyonları
XAML'de animasyonlarınızı tanımlamak ve uygulamak, başladıktan sonra animasyonlarınızı etkileşimli olarak denetlemek, karmaşık bir animasyon ağacı oluşturmak veya Style, ControlTemplate veya DataTemplateanimasyon eklemek istediğinizde Storyboard kullanın. Bir nesnenin Storyboardtarafından animasyonlu olması için, bir FrameworkElement veya FrameworkContentElementolması gerekir ya da bir FrameworkElement veya FrameworkContentElementayarlamak için kullanılması gerekir. Diğer ayrıntılar için bkz. Görsel Taslaklarına Genel Bakış.
Storyboard, içerdiği animasyonlar için hedefleme bilgileri sağlayan özel bir kapsayıcı Timeline türüdür. Storyboardile animasyon eklemek için aşağıdaki üç adımı tamamlarsınız.
Bir Storyboard ve bir veya daha fazla animasyon bildirin.
Her animasyonun hedef nesnesini ve özelliğini belirtmek için TargetName ve TargetProperty ekli özelliklerini kullanın.
(Yalnızca kod) FrameworkElement veya FrameworkContentElementiçin bir NameScope tanımlayın. Bu FrameworkElement veya FrameworkContentElementile animasyon yapmak için nesnelerin adlarını kaydedin.
Storyboard'ı başlatın.
bir Storyboard başlatıldığında animasyonları animasyonlu özelliklere uygular ve başlatır. Storyboardbaşlatmanın iki yolu vardır: Storyboard sınıfı tarafından sağlanan Begin yöntemini kullanabilir veya BeginStoryboard eylemi kullanabilirsiniz. XAML'de animasyon eklemenin tek yolu BeginStoryboard eylemi kullanmaktır. BeginStoryboard eylemi bir EventTrigger, özellik Triggerveya DataTriggeriçinde kullanılabilir.
Aşağıdaki tabloda, her Storyboard başlangıç tekniğinin desteklendiği farklı yerler gösterilmektedir: örnek başına, stil, denetim şablonu ve veri şablonu.
Storyboard kullanılarak başlatılıyor... | Örnek başına | Üslup | Denetim şablonu | Veri şablonu | Örnek |
---|---|---|---|---|---|
BeginStoryboard ve EventTrigger | Evet | Evet | Evet | Evet | Storyboard Kullanarak Bir Özelliği Animasyonlu Hale Getirme |
BeginStoryboard ve özellik Trigger | Hayır | Evet | Evet | Evet | Özellik Değeri Değiştiğinde Animasyon Tetikleme |
BeginStoryboard ve DataTrigger | Hayır | Evet | Evet | Evet | Nasıl yapılır: Veri Değiştiğinde Animasyon Tetikleme |
Begin yöntemi | Evet | Hayır | Hayır | Hayır | Storyboard Kullanarak Bir Özelliği Animasyon Yapma |
Storyboard nesneleri hakkında daha fazla bilgi için bkz. Görsel Taslaklarına Genel Bakış.
Yerel Animasyonlar
Yerel animasyonlar, herhangi bir Animatable nesnesinin bağımlılık özelliğine animasyon eklemek için kullanışlı bir yol sağlar. Bir özelliğe tek bir animasyon uygulamak istediğinizde yerel animasyonları kullanın ve başladıktan sonra animasyonu etkileşimli olarak denetlemeniz gerekmez. Storyboard animasyondan farklı olarak, yerel animasyon, bir FrameworkElement veya FrameworkContentElementile ilişkili olmayan bir nesneyi canlandırabilir. Ayrıca bu tür animasyonlar için bir NameScope tanımlamanız gerekmez.
Yerel animasyonlar yalnızca kodda kullanılabilir ve stillerde, denetim şablonlarında veya veri şablonlarında tanımlanamaz. Yerel animasyon başlatıldıktan sonra etkileşimli olarak denetlenemez.
Yerel bir animasyonu kullanarak canlandırma yapmak için aşağıdaki adımları tamamlayın.
bir AnimationTimeline nesnesi oluşturun.
Belirttiğiniz özelliğe AnimationTimeline uygulamak için animasyon eklemek istediğiniz nesnenin BeginAnimation yöntemini kullanın.
Aşağıdaki örnek, bir Buttonöğesinin genişliğini ve arka plan rengini nasıl animasyonlu hale getirebileceğinizi göstermektedir.
/*
This sample demonstrates how to apply non-storyboard animations to a property.
To animate in markup, you must use storyboards.
*/
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Navigation;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Animation;
using namespace System::Windows::Shapes;
using namespace System::Windows::Controls;
namespace Microsoft {
namespace Samples {
namespace Animation {
namespace LocalAnimations {
// Create the demonstration.
public ref class LocalAnimationExample : Page {
public:
LocalAnimationExample ()
{
WindowTitle = "Local Animation Example";
StackPanel^ myStackPanel = gcnew StackPanel();
myStackPanel->Margin = Thickness(20);
// Create and set the Button.
Button^ aButton = gcnew Button();
aButton->Content = "A Button";
// Animate the Button's Width.
DoubleAnimation^ myDoubleAnimation = gcnew DoubleAnimation();
myDoubleAnimation->From = 75;
myDoubleAnimation->To = 300;
myDoubleAnimation->Duration = Duration(TimeSpan::FromSeconds(5));
myDoubleAnimation->AutoReverse = true;
myDoubleAnimation->RepeatBehavior = RepeatBehavior::Forever;
// Apply the animation to the button's Width property.
aButton->BeginAnimation(Button::WidthProperty, myDoubleAnimation);
// Create and animate a Brush to set the button's Background.
SolidColorBrush^ myBrush = gcnew SolidColorBrush();
myBrush->Color = Colors::Blue;
ColorAnimation^ myColorAnimation = gcnew ColorAnimation();
myColorAnimation->From = Colors::Blue;
myColorAnimation->To = Colors::Red;
myColorAnimation->Duration = Duration(TimeSpan::FromMilliseconds(7000));
myColorAnimation->AutoReverse = true;
myColorAnimation->RepeatBehavior = RepeatBehavior::Forever;
// Apply the animation to the brush's Color property.
myBrush->BeginAnimation(SolidColorBrush::ColorProperty, myColorAnimation);
aButton->Background = myBrush;
// Add the Button to the panel.
myStackPanel->Children->Add(aButton);
this->Content = myStackPanel;
};
};
}
}
}
}
/*
This sample demonstrates how to apply non-storyboard animations to a property.
To animate in markup, you must use storyboards.
*/
using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls;
namespace Microsoft.Samples.Animation.LocalAnimations
{
// Create the demonstration.
public class LocalAnimationExample : Page
{
public LocalAnimationExample()
{
WindowTitle = "Local Animation Example";
StackPanel myStackPanel = new StackPanel();
myStackPanel.Margin = new Thickness(20);
// Create and set the Button.
Button aButton = new Button();
aButton.Content = "A Button";
// Animate the Button's Width.
DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = 75;
myDoubleAnimation.To = 300;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
myDoubleAnimation.AutoReverse = true;
myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
// Apply the animation to the button's Width property.
aButton.BeginAnimation(Button.WidthProperty, myDoubleAnimation);
// Create and animate a Brush to set the button's Background.
SolidColorBrush myBrush = new SolidColorBrush();
myBrush.Color = Colors.Blue;
ColorAnimation myColorAnimation = new ColorAnimation();
myColorAnimation.From = Colors.Blue;
myColorAnimation.To = Colors.Red;
myColorAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(7000));
myColorAnimation.AutoReverse = true;
myColorAnimation.RepeatBehavior = RepeatBehavior.Forever;
// Apply the animation to the brush's Color property.
myBrush.BeginAnimation(SolidColorBrush.ColorProperty, myColorAnimation);
aButton.Background = myBrush;
// Add the Button to the panel.
myStackPanel.Children.Add(aButton);
this.Content = myStackPanel;
}
}
}
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''This sample demonstrates how to apply non-storyboard animations to a property.
'''To animate in markup, you must use storyboards.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Imports System.Windows
Imports System.Windows.Navigation
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports System.Windows.Controls
Namespace Microsoft.Samples.Animation.LocalAnimations
' Create the demonstration.
Public Class LocalAnimationExample
Inherits Page
Public Sub New()
WindowTitle = "Animate Property Example"
Dim myStackPanel As New StackPanel()
myStackPanel.Margin = New Thickness(20)
' Create and set the Button.
Dim aButton As New Button()
aButton.Content = "A Button"
' Animate the Button's Width.
Dim myDoubleAnimation As New DoubleAnimation()
myDoubleAnimation.From = 75
myDoubleAnimation.To = 300
myDoubleAnimation.Duration = New Duration(TimeSpan.FromSeconds(5))
myDoubleAnimation.AutoReverse = True
myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever
' Apply the animation to the button's Width property.
aButton.BeginAnimation(Button.WidthProperty, myDoubleAnimation)
' Create and animate a Brush to set the button's Background.
Dim myBrush As New SolidColorBrush()
myBrush.Color = Colors.Blue
Dim myColorAnimation As New ColorAnimation()
myColorAnimation.From = Colors.Blue
myColorAnimation.To = Colors.Red
myColorAnimation.Duration = New Duration(TimeSpan.FromMilliseconds(7000))
myColorAnimation.AutoReverse = True
myColorAnimation.RepeatBehavior = RepeatBehavior.Forever
' Apply the animation to the brush's Color property.
myBrush.BeginAnimation(SolidColorBrush.ColorProperty, myColorAnimation)
aButton.Background = myBrush
' Add the Button to the panel.
myStackPanel.Children.Add(aButton)
Me.Content = myStackPanel
End Sub
End Class
End Namespace
Saat Animasyonları
Storyboard kullanmadan animasyon eklemek ve karmaşık zamanlama ağaçları oluşturmak veya başladıktan sonra animasyonları etkileşimli olarak denetlemek istediğinizde Clock nesneleri kullanın. Herhangi bir Animatable nesnesinin bağımlılık özelliğine animasyon eklemek için Saat nesnelerini kullanabilirsiniz.
Stillerde, denetim şablonlarında veya veri şablonlarında animasyon eklemek için doğrudan Clock nesneleri kullanamazsınız. (Animasyon ve zamanlama sistemi aslında stillerde, denetim şablonlarında ve veri şablonlarında animasyon eklemek için Clock nesneleri kullanır, ancak bu Clock nesnelerini sizin için bir Storyboardoluşturmalıdır. Storyboard nesneleriyle Clock nesneleri arasındaki ilişki hakkında daha fazla bilgi için bkz. Animasyon ve Zamanlama Sistemine Genel Bakış.)
Bir özelliğe tek bir Clock uygulamak için aşağıdaki adımları tamamlarsınız.
bir AnimationTimeline nesnesi oluşturun.
AnimationClockoluşturmak için, AnimationTimeline'in CreateClock yöntemini kullanın.
İstediğiniz özelliğe AnimationClock uygulamak için animasyon yapmak istediğiniz nesnenin ApplyAnimationClock yöntemini kullanın.
Aşağıdaki örnekte, bir AnimationClock oluşturma ve iki benzer özelliğe uygulama gösterilmektedir.
/*
This example shows how to create and apply
an AnimationClock.
*/
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace Microsoft.Samples.Animation.TimingBehaviors
{
public class AnimationClockExample : Page
{
ScaleTransform myScaleTransform;
public AnimationClockExample()
{
this.WindowTitle = "Opacity Animation Example";
this.Background = Brushes.White;
StackPanel myStackPanel = new StackPanel();
myStackPanel.Margin = new Thickness(20);
// Create a button that with a ScaleTransform.
// The ScaleTransform will animate when the
// button is clicked.
Button myButton = new Button();
myButton.Margin = new Thickness(50);
myButton.HorizontalAlignment = HorizontalAlignment.Left;
myButton.Content = "Click Me";
myScaleTransform = new ScaleTransform(1,1);
myButton.RenderTransform = myScaleTransform;
// Associate an event handler with the
// button's Click event.
myButton.Click += new RoutedEventHandler(myButton_Clicked);
myStackPanel.Children.Add(myButton);
this.Content = myStackPanel;
}
// Create and apply and animation when the button is clicked.
private void myButton_Clicked(object sender, RoutedEventArgs e)
{
// Create a DoubleAnimation to animate the
// ScaleTransform.
DoubleAnimation myAnimation =
new DoubleAnimation(
1, // "From" value
5, // "To" value
new Duration(TimeSpan.FromSeconds(5))
);
myAnimation.AutoReverse = true;
// Create a clock the for the animation.
AnimationClock myClock = myAnimation.CreateClock();
// Associate the clock the ScaleX and
// ScaleY properties of the button's
// ScaleTransform.
myScaleTransform.ApplyAnimationClock(
ScaleTransform.ScaleXProperty, myClock);
myScaleTransform.ApplyAnimationClock(
ScaleTransform.ScaleYProperty, myClock);
}
}
}
'
' This example shows how to create and apply
' an AnimationClock.
'
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Namespace Microsoft.Samples.Animation.TimingBehaviors
Public Class AnimationClockExample
Inherits Page
Private ReadOnly myScaleTransform As ScaleTransform
Public Sub New()
WindowTitle = "Opacity Animation Example"
Background = Brushes.White
Dim myStackPanel As New StackPanel With {
.Margin = New Thickness(20)
}
' Create a button that with a ScaleTransform.
' The ScaleTransform will animate when the
' button is clicked.
Dim myButton As New Button With {
.Margin = New Thickness(50),
.HorizontalAlignment = HorizontalAlignment.Left,
.Content = "Click Me"
}
myScaleTransform = New ScaleTransform(1,1)
myButton.RenderTransform = myScaleTransform
' Associate an event handler with the
' button's Click event.
AddHandler myButton.Click, AddressOf myButton_Clicked
myStackPanel.Children.Add(myButton)
Content = myStackPanel
End Sub
' Create and apply and animation when the button is clicked.
Private Sub myButton_Clicked(sender As Object, e As RoutedEventArgs)
' Create a DoubleAnimation to animate the
' ScaleTransform.
Dim myAnimation As New DoubleAnimation(1, 5, New Duration(TimeSpan.FromSeconds(5))) With {
.AutoReverse = True
} ' "To" value - "From" value
' Create a clock the for the animation.
Dim myClock As AnimationClock = myAnimation.CreateClock()
' Associate the clock the ScaleX and
' ScaleY properties of the button's
' ScaleTransform.
myScaleTransform.ApplyAnimationClock(ScaleTransform.ScaleXProperty, myClock)
myScaleTransform.ApplyAnimationClock(ScaleTransform.ScaleYProperty, myClock)
End Sub
End Class
End Namespace
Zamanlama ağacı oluşturmak ve özelliklere animasyon eklemek için aşağıdaki adımları tamamlarsınız.
Zamanlama ağacını oluşturmak için ParallelTimeline ve AnimationTimeline nesneleri kullanın.
Kök ParallelTimeline'in CreateClock'ını kullanarak bir ClockGroupoluşturun.
ClockGroup'in Children'sunu yineleyin ve çocuk Clock nesnelerini uygulayın. Her bir AnimationClock alt öğesi için, belirttiğiniz özelliğe AnimationClock uygulamak amacıyla animasyon yapmak istediğiniz nesnenin ApplyAnimationClock yöntemini kullanın.
Saat nesneleri hakkında daha fazla bilgi için bkz. Animasyon ve Zamanlama Sistemine Genel Bakış.
Per-Frame Animasyon: Animasyon ve Zamanlama Sistemini Atlama
WPF animasyon sistemini tamamen atlamanız gerektiğinde bu yaklaşımı kullanın. Bu yaklaşım için bir senaryo, animasyondaki her adımın nesnelerin son nesne etkileşimleri kümesine göre yeniden derlenmesini gerektirdiği fizik animasyonlarıdır.
Çerçeve başına animasyonlar stiller, denetim şablonları veya veri şablonları içinde tanımlanamaz.
Çerçeve çerçeve animasyon yapmak için, animasyon yapmak istediğiniz nesneleri içeren nesnenin Rendering olayına kaydolun. Bu olay işleyici yöntemi çerçeve başına bir kez çağrılır. WPF, görsel ağaçtaki kalıcı işleme verilerini kompozisyon ağacına her aktardığında, olay işleyici yöntemi çağrılır.
Olay işleyicinizde, animasyon efektiniz için gereken hesaplamaları yapın ve bu değerlerle animasyon eklemek istediğiniz nesnelerin özelliklerini ayarlayın.
Geçerli çerçevenin sunum zamanını elde etmek için, bu olayla ilişkili EventArgsRenderingEventArgsolarak dönüştürülebilir ve bu da geçerli çerçevenin işlenme zamanını almak için kullanabileceğiniz bir RenderingTime özelliği elde etmenizi sağlar.
Daha fazla bilgi için Rendering sayfasına bakın.
Ayrıca bkz.
.NET Desktop feedback