타이밍 이벤트 개요Timing Events Overview

이 항목에서는에서 사용할 수 있는 5 가지 타이밍 이벤트를 사용 하는 방법 설명 TimelineClock 개체입니다.This topic describes how to use the five timing events available on Timeline and Clock objects.

전제 조건Prerequisites

이 항목을 이해하려면 애니메이션을 만들고 사용하는 방법을 이해해야 합니다.To understand this topic, you should understand how to create and use animations. 애니메이션 사용을 시작 하려면 참조는 애니메이션 개요합니다.To get started with animation, see the Animation Overview.

속성에 애니메이션 효과를 주는 여러 가지 WPFWPF:There are multiple ways to animate properties in WPFWPF:

이 개요의 예제를 사용 하는 태그 및 코드에서 사용할 수 있습니다, 되므로 Storyboard 개체입니다.Because you can use them in markup and code, the examples in this overview use Storyboard objects. 그러나 설명된 개념을 속성에 애니메이션 효과를 주는 다른 방법에도 적용할 수 있습니다.However, the concepts described can be applied to the other methods of animating properties.

클록이란?What is a clock?

타임라인 자체는 실제로 시간 세그먼트를 설명하는 것 이외의 어떤 작업도 수행하지 않습니다.A timeline, by itself, doesn't actually do anything other than describe a segment of time. 타임 라인의 Clock 실제 작업을 수행 하는 개체: 타임 라인에 대 한 타이밍 관련 런타임 상태를 유지 관리 합니다.It's the timeline's Clock object that does the real work: it maintains timing-related run-time state for the timeline. Storyboard를 사용할 때와 같이 대부분의 경우에 타임라인에 대해 자동으로 클록이 생성됩니다.In most cases, such as when using storyboards, a clock is created automatically for your timeline. 만들 수도 있습니다는 Clock 를 사용 하 여 명시적으로 CreateClock 메서드.You can also create a Clock explicitly by using the CreateClock method. 에 대 한 자세한 내용은 Clock 개체를 참조 합니다 애니메이션 및 타이밍 시스템 개요합니다.For more information about Clock objects, see the Animation and Timing System Overview.

이벤트를 사용하는 이유Why Use Events?

하나(마지막 틱에 맞춰진 검색)를 제외한 모든 대화형 타이밍 작업은 비동기적입니다.With the exception of one (seek aligned to last tick), all interactive timing operations are asynchronous. 실행될 시기를 정확히 알 방법은 없습니다.There is no way for you to know exactly when they will execute. 타이밍 작업에 의존하는 다른 코드가 있을 때는 문제가 될 수입니다.That can be a problem when you have other code that's dependent upon your timing operation. 사각형에 애니메이션 효과를 적용한 타임라인을 중지하려고 한다고 가정해 보겠습니다.Suppose that you wanted to stop a timeline that animated a rectangle. 이 타임라인이 중지된 후에 사각형의 색을 변경합니다.After the timeline stops, you change the color of the rectangle.

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

앞의 예제에서 두 번째 코드 줄은 Storyboard가 중지되기 전에 실행될 수 있습니다.In the previous example, the second line of code might execute before the storyboard stops. 중지는 비동기 작업이기 때문입니다.That's because stopping is an asynchronous operation. 타임라인이나 클록에 중지하도록 지시하면 타이밍 엔진의 다음 틱까지는 처리되지 않는 일종의 “중지 요청”이 만들어집니다.Telling a timeline or clock to stop creates a "stop request" of sorts that isn't processed until the timing engine's next tick.

타임라인이 완료된 후에 명령을 실행하려면 타이밍 이벤트를 사용합니다.To execute commands after a timeline completes, use timing events. 다음 예제에서 이벤트 처리기는 Storyboard가 재생을 중지한 후에 사각형의 색을 변경하는 데 사용됩니다.In the following example, an event handler is used to change the color of a rectangle after the storyboard stops playing.

// 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

자세한 예제를 보려면 수신 알림 경우 클록 상태가 변경합니다.For a more complete example, see Receive Notification When a Clock's State Changes.

Public 이벤트Public Events

합니다 TimelineClock 클래스는 둘 다 5 가지 타이밍 이벤트를 제공 합니다.The Timeline and Clock classes both provide five timing events. 다음 표에는 이러한 이벤트와 해당 이벤트를 트리거하는 조건이 나와 있습니다.The following table lists these events and the conditions that trigger them.

이벤트(event)Event 트리거하는 대화형 작업Triggering interactive operation 기타 트리거Other triggers
CompletedCompleted 건너뛰어서 채우기Skip to fill 클록이 완료됩니다.The clock completes.
CurrentGlobalSpeedInvalidatedCurrentGlobalSpeedInvalidated 일시 중지, 다시 시작, 검색, 속도 비율 설정, 건너뛰어서 채우기, 중지Pause, resume, seek, set speed ratio, skip to fill, stop 클록이 거꾸로 진행되거나, 가속되거나, 시작되거나, 중지됩니다.The clock reverses, accelerates, starts, or stops.
CurrentStateInvalidatedCurrentStateInvalidated 시작, 건너뛰어서 채우기, 중지Begin, skip to fill, stop 클록이 시작되거나, 중지되거나, 채워집니다.The clock starts, stops, or fills.
CurrentTimeInvalidatedCurrentTimeInvalidated 시작, 검색, 건너뛰어서 채우기, 중지Begin, seek, skip to fill, stop 클록이 진행됩니다.The clock progresses.
RemoveRequestedRemoveRequested 제거Remove

틱 및 이벤트 통합Ticking and Event Consolidation

개체에 애니메이션 효과 주는 경우 WPFWPF, 타이밍 엔진 애니메이션을 관리 하는 것입니다.When you animate objects in WPFWPF, it’s the timing engine that manages your animations. 타이밍 엔진은 시간의 진행을 추적하고 각 애니메이션의 상태를 계산합니다.The timing engine tracks the progression of time and computes the state of each animation. 1초 안에 이러한 많은 계산 패스가 진행됩니다.It makes many such evaluation passes in a second. 이러한 계산 패스를 "틱"이라고 합니다.These evaluation passes are known as "ticks."

틱은 자주 발생하지만 틱 간에 많은 사항이 발생할 수 있습니다.While ticks occur frequently, it's possible for a lot of things to happen between ticks. 예를 들어 타임라인이 중지되었다가 시작된 후 다시 중지될 수 있습니다. 이 경우 현재 상태는 3번 변경됩니다.For example, a timeline might be stopped, started, and stopped again, in which case its current state will have changed three times. 이론적으로 단일 틱에서 이벤트가 여러 번 발생할 수 있지만 타이밍 엔진은 이벤트를 통합하므로 각 이벤트는 틱마다 한 번만 발생할 수 있습니다.In theory, the event could be raised multiple times in a single tick; however, the timing engine consolidates events, so that each event can be raised at most once per tick.

이벤트 등록Registering for Events

타이밍 이벤트를 등록하는 방법에는 두 가지가 있습니다. 하나는 타임라인에 등록하는 것이고 다른 하나는 타임라인에서 생성된 클록에 등록하는 것입니다.There are two ways to register for timing events: you can register with the timeline or with the clock created from the timeline. 이벤트를 클록에 직접 등록하는 과정은 매우 간단합니다. 단, 반드시 코드에서만 수행할 수 있다는 단점이 있습니다.Registering for an event directly with a clock is fairly straightforward, although it can only be done from code. 태그 또는 코드에서 타임라인에 이벤트를 등록할 수 있습니다.You can register for events with a timeline from markup or code. 다음 섹션에서는 타임라인에 클록 이벤트를 등록하는 방법을 설명합니다.The next section describes how to register for clock events with a timeline.

타임라인에 클록 이벤트 등록Registering for Clock Events with a Timeline

하지만 타임 라인의 Completed, CurrentGlobalSpeedInvalidatedCurrentStateInvalidatedCurrentTimeInvalidated, 및 RemoveRequested 이벤트 타임 라인의 이러한 이벤트와 이벤트 처리기에 실제로 연결에 대 한 등록을 사용 하 여 연결 되도록 표시는 Clock 타임 라인에 대해 만들어집니다.Although a timeline's Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated, and RemoveRequested events appear to be associated with the timeline, registering for these events actually associates an event handler with the Clock created for the timeline.

등록할 때 합니다 Completed 타임 라인에서 이벤트, 예를 들어 실제로 못하도록 시스템에 대 한 등록을 Completed 타임 라인에 대해 만든 각 클록의 이벤트입니다.When you register for the Completed event on a timeline, for example, you're actually telling the system to register for the Completed event of each clock that is created for the timeline. 코드에서이 이벤트 전에 등록 해야 합니다는 Clock ;이 타임 라인에 대해 만들어집니다 알림을 받을 수 없습니다이 고, 그렇지 합니다.In code, you must register for this event before the Clock is created for this timeline; otherwise, you won't receive notification. 자동으로 이런 XAMLXAML; 되기 전에 이벤트에 대 한 파서를 자동으로 등록 된 Clock 만들어집니다.This happens automatically in XAMLXAML; the parser automatically registers for the event before the Clock is created.

참고자료See also