Zamanlama Olaylarına Genel Bakış
Bu konuda, ve nesnelerinde kullanılabilir olan beş zamanlama olayının nasıl kullanılacağı Timeline açıklanmaktadır Clock .
Önkoşullar
Bu konuyu anlamak için animasyonların nasıl oluşturulduğunu ve kullanıldığını anlamanız gerekir. Animasyonu kullanmaya başlamak için animasyon genel bakış ' abakın.
WPF özelliklerine animasyon uygulamak için birden çok yol vardır:
Görsel taslak nesneleri (biçimlendirme ve kod) kullanma: nesneleri bir veya daha fazla nesneye göre düzenlemek ve dağıtmak için kullanabilirsiniz. Bir örnek için bkz. görsel taslak kullanarak özelliğe animasyon ekleme.
Yerel animasyonları kullanma (yalnızca kod): nesneleri doğrudan canlandırdıkları özelliklere uygulayabilirsiniz. Bir örnek için bkz. görsel taslak kullanmadan özelliğe animasyon ekleme.
Saatleri kullanma (yalnızca kod): Saat oluşturmayı açık bir şekilde yönetebilir ve animasyon saatlerini kendiniz dağıtabilirsiniz. Bir örnek için bkz. bir animasyon saati kullanarak bir özelliğe animasyon ekleme.
Bunları biçimlendirme ve kod içinde kullanabilmeniz için bu genel bakışdaki örneklerde Storyboard nesneleri kullanın. Ancak, açıklanan kavramlar, hareketlendirilen özelliklerin diğer yöntemlerine uygulanabilir.
Saat nedir?
Tek bir zaman çizelgesi, bir zaman kesimini betimleyen, aslında hiçbir şey yapmaz. Bu, gerçek işi yapan zaman çizelgesinin Clock nesnesidir: zaman çizelgesi için zamanlamasıyla ilgili çalışma zamanı durumunu saklar. Film şeritleri kullanılırken olduğu gibi çoğu durumda, zaman çizelgeniz için bir saat otomatik olarak oluşturulur. ClockYöntemini kullanarak açıkça de oluşturabilirsiniz CreateClock . Nesneler hakkında daha fazla bilgi için Clock bkz. Clock.
Neden olay kullanmalıyım?
Tek istisna (son Tick 'e hizalı arama) ile tüm etkileşimli zamanlama işlemleri zaman uyumsuzdur. Ne zaman yürütülecektir tam olarak bilmeniz mümkün değildir. Bu, zamanlama işlemine bağlı başka bir kodunuz olduğunda sorun olabilir. Bir dikdörtgenin animasyonunu yapan bir zaman çizelgesini durdurmak istediğinizi varsayalım. Zaman çizelgesi durdurulduğunda, dikdörtgenin rengini değiştirirsiniz.
myStoryboard.Stop(myRectangle);
// This statement might execute
// before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue;
myStoryboard.Stop(myRectangle)
' This statement might execute
' before the storyboard has stopped.
myRectangle.Fill = Brushes.Blue
Önceki örnekte, ikinci kod satırı film şeridi durdurulmadan önce yürütülemeyebilir. Bunun nedeni, durdurma zaman uyumsuz bir işlemdir. Bir zaman çizelgesine veya durdurulacak saatin durdurulmasına, zamanlama altyapısının bir sonraki Tick 'e kadar işlenmediği sıralamalar "durdurma isteği" oluşturulur.
Bir zaman çizelgesi tamamlandıktan sonra komutları yürütmek için zamanlama olaylarını kullanın. Aşağıdaki örnekte, film şeridi yürütmeyi başlattıktan sonra dikdörtgenin rengini değiştirmek için bir olay işleyicisi kullanılır.
// Register for the CurrentStateInvalidated timing event.
myStoryboard.CurrentStateInvalidated += new EventHandler(myStoryboard_CurrentStateInvalidated);
' Register for the CurrentStateInvalidated timing event.
AddHandler myStoryboard.CurrentStateInvalidated, AddressOf myStoryboard_CurrentStateInvalidated
// Change the rectangle's color after the storyboard stops.
void myStoryboard_CurrentStateInvalidated(object sender, EventArgs e)
{
Clock myStoryboardClock = (Clock)sender;
if (myStoryboardClock.CurrentState == ClockState.Stopped)
{
myRectangle.Fill = Brushes.Blue;
}
}
' Change the rectangle's color after the storyboard stops.
Private Sub myStoryboard_CurrentStateInvalidated(ByVal sender As Object, ByVal e As EventArgs)
Dim myStoryboardClock As Clock = CType(sender, Clock)
If myStoryboardClock.CurrentState = ClockState.Stopped Then
myRectangle.Fill = Brushes.Blue
End If
End Sub
Daha kapsamlı bir örnek için bkz. saatin durumu değiştiğinde bildirim alma.
Ortak Olaylar
TimelineVe Clock sınıflarının her ikisi de beş zamanlama olayı sağlar. Aşağıdaki tabloda bu olaylar ve bunları tetikleyen koşullar listelenmektedir.
| Olay | Etkileşimli işlem tetikleniyor | Diğer Tetikleyiciler |
|---|---|---|
| Tamamlandı | Doldurmaya Atla | Saat tamamlanır. |
| CurrentGlobalSpeedInvalidated | Duraklatma, devam etmeyi, arama, hız oranını ayarlama, dolguyu atla, durdur | Saat tersine çevirir, hızlandırır, başlar veya sonlandırır. |
| Currentstategeçersiz kılındı | Başlayın, dolguyu atla, durdur | Saat başlar, duraklar veya dolguları. |
| Currenttimegeçersiz kılındı | Başlat, ara, dolguyu atla, durdur | Saat ilerler. |
| Removerequin | Kaldır |
Görü ve olay birleştirme
WPF 'deki nesnelere animasyon uyguladığınızda, animasyonlarınızı yöneten zamanlama motoru vardır. Zamanlama altyapısı zaman ilerlemesini izler ve her animasyonun durumunu hesaplar. Bir saniyede birçok değerlendirme geçişi yapar. Bu değerlendirme geçişleri "ticks" olarak bilinir.
Tick 'ler sık gerçekleşirken, Tick 'ler arasında çok sayıda şeyin gerçekleşmesi mümkündür. Örneğin, bir zaman çizelgesi durdurulmuş, başlatılmış ve yeniden durdurulmuş olabilir, bu durumda geçerli durumu üç kez değişir. Teorik olarak, olay tek bir tick içinde birden çok kez yükseltilebilir; Ancak zamanlama altyapısı olayları birleştirir, böylece her bir olay her dönem için en fazla bir kez oluşturulabilir.
Olaylara kaydolma
Zamanlama olaylarına kaydolmak için iki yol vardır: zaman çizelgesine veya zaman çizelgesinden oluşturulan saatle kayıt yapabilirsiniz. Bir olayı doğrudan bir saatle kaydetmek oldukça basittir, ancak yalnızca koddan yapılabilir. Biçimlendirme veya koddan bir zaman çizelgesine sahip olaylara kaydolabilirsiniz. Sonraki bölümde, saat olaylarının zaman çizelgesi ile nasıl kaydedileceği açıklanmaktadır.
Zaman çizelgesi ile saat olaylarını kaydetme
Zaman çizelgesinin,, Completed , CurrentGlobalSpeedInvalidatedCurrentStateInvalidatedCurrentTimeInvalidated ve RemoveRequested olaylarının zaman çizelgesi ile ilişkilendirilmesi gibi görünmesine karşın, bu olaylara kaydolmak gerçekten Clock zaman çizelgesi için oluşturulan bir olay işleyicisini ilişkilendirir.
CompletedOlay için bir zaman çizelgesinde kayıt yaptığınızda, aslında sisteme, Completed zaman çizelgesi için oluşturulan her bir saatin olayına kaydolmasını söylemiş olursunuz. Kod içinde bu zaman çizelgesi için oluşturulmadan önce bu olaya kaydolmanız gerekir Clock ; Aksi takdirde, bildirim almazsınız. Bu, XAML 'de otomatik olarak gerçekleşir; Ayrıştırıcı, olay oluşturulmadan önce otomatik olarak kaydeder Clock .