Aracılığıyla paylaş


Zamanlama Olaylarına Genel Bakış

Bu konuda, Timeline ve Clock nesnelerinde kullanılabilen beş zamanlama olayının nasıl kullanılacağı açıklanmaktadır.

Önkoşullar

Bu konuyu anlamak için animasyon oluşturmayı ve kullanmayı anlamanız gerekir. Animasyonu kullanmaya başlamak için bkz. Animasyona Genel Bakış.

WPF'de özelliklere animasyon eklemenin birden çok yolu vardır:

  • Görsel taslak nesnelerini kullanma (işaretleme ve kod): Animasyonları düzenlemek ve bir veya daha fazla nesneye dağıtmak için Storyboard nesneleri kullanabilirsiniz. Örnek için bkz. Görsel TaslakKullanarak Özelliğe Animasyon Ekleme.

  • Yerel animasyonları kullanma (yalnızca kod): AnimationTimeline nesneleri doğrudan animasyon yaptıkları özelliklere uygulayabilirsiniz. Örnek için bkz. Görsel Taslak Kullanmadan Özelliğe Animasyon Ekleme.

  • Saat kullanma (yalnızca kod): Saat oluşturmayı açıkça yönetebilir ve animasyon saatlerini kendiniz dağıtabilirsiniz. Örnek için bkz. AnimationClockKullanarak Özelliğe Animasyon Ekleme.

Bunları işaretleme ve kodda kullanabileceğiniz için, bu genel bakıştaki örnekler Storyboard nesneleri kullanır. Ancak, açıklanan kavramlar diğer özellikler animasyonu yöntemlerine uygulanabilir.

Saat nedir?

Zaman çizelgesi tek başına bir zaman dilimini tanımlamaktan başka bir şey yapmaz. Gerçek işi yapan, zaman çizelgesinin Clock nesnesidir: Bu nesne, zaman çizelgesi için zamanlamayla ilgili çalışma zamanı durumunu korur. Görsel taslakları kullanırken olduğu gibi çoğu durumda zaman çizelgeniz için otomatik olarak bir saat oluşturulur. ayrıca CreateClock yöntemini kullanarak açıkça bir Clock oluşturabilirsiniz. Clock nesneleri hakkında daha fazla bilgi için bkz. Animasyon ve Zamanlama Sistemine Genel Bakış.

Neden Olaylar Kullanılır?

Bir işlem (son tik'e hizalanmış konumlandırma) dışında, tüm etkileşimli zamanlama işlemleri zaman uyumsuzdur. Tam olarak ne zaman yürütüleceklerini bilmenin hiçbir yolu yok. Zamanlama işleminize bağımlı olan başka bir kodunuz olduğunda bu sorun olabilir. Dikdörtgen animasyonu oluşturan bir zaman çizelgesini durdurmak istediğinizi varsayalım. Zaman çizelgesi durduktan sonra 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ı görsel taslak durdurulmadan önce yürütülebilir. Bunun nedeni durdurma işleminin zaman uyumsuz bir işlem olmasıdır. Bir zaman çizelgesine veya saate durmasını söylemek, zamanlama motorunun bir sonraki tıkına kadar işlenmeyen bir tür "durdurma isteği" oluşturur.

Zaman çizelgesi tamamlandıktan sonra komutları yürütmek için zamanlama olaylarını kullanın. Aşağıdaki örnekte, hikaye tahtası oynamayı durdurduktan 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 eksiksiz bir örnek için bkz. Saatin Durumu Değiştiğinde Bildirim Alma.

Genel Olaylar

Timeline ve Clock sınıfları beş zamanlama olayı sağlar. Aşağıdaki tabloda bu olaylar ve bunları tetikleyen koşullar listelemektedir.

Etkinlik Etkileşimli işlemi tetikleme Diğer tetikleyiciler
Tamamlandı Doldurma bölümüne atla Saat tamam.
MevcutKüreselHızGeçersizKılındı Duraklatma, sürdürme, arama, hız oranını ayarlama, doldurmaya atlama, durdurma Saat tersine döner, hızlandırır, başlatılır veya durur.
CurrentStateInvalidated Başla, doldurmayı atla, durdur Saat başlar, durur veya dolar.
MevcutZamanGeçersiz Başlangıç, arama, doldurmaya atlama, durdurma Saat ilerler.
RemoveRequested Kaldır

Zamanlama ve Olay Birleştirme

WPF'de nesnelere animasyon eklediğinizde, animasyonlarınızı yöneten zamanlama altyapısıdır. Zamanlama altyapısı zamanın ilerlemesini izler ve her animasyonun durumunu hesaplar. Bir saniyede birçok bu tür değerlendirme gerçekleştirir. Bu değerlendirme geçişleri "onay işareti" olarak bilinir.

Keneler sık sık gerçekleşirken, keneler arasında birçok şeyin gerçekleşmesi mümkündür. Örneğin, bir zaman çizelgesi durdurulabilir, başlatılabilir ve yeniden durdurulabilir ve bu durumda geçerli durumu üç kez değişmiş olur. Teoride, olay bir zaman dilimi içinde birden çok kez tetiklenebilir; ancak zamanlama motoru olayları konsolide eder, böylece her olay her bir tik başına en fazla bir kez tetiklenebilir.

Olaylara Kaydolma

Zamanlama olaylarına kaydolmanın iki yolu vardır: zaman çizelgesine veya zaman çizelgesinden oluşturulan saate kaydolabilirsiniz. Bir olaya doğrudan saatle kaydolmak oldukça basittir, ancak yalnızca koddan yapılabilir. İşaretlemeyi veya kodu kullanarak zaman çizelgesiyle olaylara kaydolabilirsiniz. Sonraki bölümde, zaman çizelgesiyle saat olaylarına nasıl kayıt olunacağı açıklanmaktadır.

Zaman Çizelgesi ile Saat Olaylarına Kaydolma

Zaman çizelgesinin Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidatedve RemoveRequested olayları zaman çizelgesiyle ilişkilendirilmiş gibi görünse de, bu olaylara kaydolmak aslında bir olay işleyicisini zaman çizelgesi için oluşturulan Clock ile ilişkilendirir.

Örneğin bir zaman çizelgesinde Completed olayına kaydolduğunuz zaman, sisteme aslında zaman çizelgesi için oluşturulan her saatin Completed olayına kaydolmasını söylemiş olursunuz. Kodda, bu zaman çizelgesi için Clock oluşturulmadan önce bu olaya kaydolmanız gerekir; aksi takdirde bildirim almazsınız. Bu, XAML'de otomatik olarak gerçekleşir; ayrıştırıcı, Clock oluşturulmadan önce olay için otomatik olarak kaydeder.

Ayrıca bkz.