타이밍 이벤트 개요
이 항목에서는 Timeline 및 Clock 개체에 사용할 수 있는 다섯 가지 타이밍 이벤트를 사용하는 방법에 대해 설명합니다.
필수 구성 요소
이 항목을 이해하려면 애니메이션을 만들고 사용하는 방법을 이해해야 합니다. 애니메이션을 시작하려면 애니메이션 개요를 참조하세요.
WPF에서 다음과 같은 여러 가지 방법으로 속성에 애니메이션 효과를 줄 수 있습니다.
스토리보드 개체 사용(태그 및 코드): Storyboard 개체를 사용하여 애니메이션을 정렬하고 하나 이상의 개체에 배포할 수 있습니다. 예제를 보려면 Storyboard를 사용하여 속성에 애니메이션 효과 주기를 참조하세요.
로컬 애니메이션 사용(코드만): AnimationTimeline 개체를 애니메이션 효과를 주려는 속성에 직접 적용할 수 있습니다. 예제를 보려면 Storyboard를 사용하지 않고 속성에 애니메이션 효과 주기를 참조하세요.
클록 사용(코드만): 클록 생성을 명시적으로 관리하고 애니메이션 클록을 직접 배포할 수 있습니다. 예제를 보려면 AnimationClock을 사용하여 속성에 애니메이션 효과 적용을 참조하세요.
태그 및 코드에서 사용할 수 있으므로 이 개요의 예제는 Storyboard 개체를 사용합니다. 그러나 설명된 개념을 속성에 애니메이션 효과를 주는 다른 방법에도 적용할 수 있습니다.
클록이란?
타임라인 자체는 실제로 시간 세그먼트를 설명하는 것 이외의 어떤 작업도 수행하지 않습니다. 실제 작업을 수행하는 타임라인의 Clock 개체입니다. 즉, 타임라인의 타이밍 관련 런타임 상태를 유지합니다. Storyboard를 사용할 때와 같이 대부분의 경우에 타임라인에 대해 자동으로 클록이 생성됩니다. CreateClock 메서드를 사용하여 명시적으로 Clock을 만들 수도 있습니다. Clock 개체에 대한 자세한 내용은 애니메이션 및 타이밍 시스템 개요를 참조하세요.
이벤트를 사용하는 이유
하나(마지막 틱에 맞춰진 검색)를 제외한 모든 대화형 타이밍 작업은 비동기적입니다. 실행될 시기를 정확히 알 방법은 없습니다. 타이밍 작업에 의존하는 다른 코드가 있을 때는 문제가 될 수입니다. 사각형에 애니메이션 효과를 적용한 타임라인을 중지하려고 한다고 가정해 보겠습니다. 이 타임라인이 중지된 후에 사각형의 색을 변경합니다.
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가 중지되기 전에 실행될 수 있습니다. 중지는 비동기 작업이기 때문입니다. 타임라인이나 클록에 중지하도록 지시하면 타이밍 엔진의 다음 틱까지는 처리되지 않는 일종의 “중지 요청”이 만들어집니다.
타임라인이 완료된 후에 명령을 실행하려면 타이밍 이벤트를 사용합니다. 다음 예제에서 이벤트 처리기는 Storyboard가 재생을 중지한 후에 사각형의 색을 변경하는 데 사용됩니다.
// 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
전체 예제를 보려면 클록 상태가 변경될 때 알림 받기를 참조하세요.
Public 이벤트
Timeline 및 Clock 클래스는 모두 5개의 타이밍 이벤트를 제공합니다. 다음 표에는 이러한 이벤트와 해당 이벤트를 트리거하는 조건이 나와 있습니다.
이벤트 | 트리거하는 대화형 작업 | 기타 트리거 |
---|---|---|
완료됨 | 건너뛰어서 채우기 | 클록이 완료됩니다. |
CurrentGlobalSpeedInvalidated | 일시 중지, 다시 시작, 검색, 속도 비율 설정, 건너뛰어서 채우기, 중지 | 클록이 거꾸로 진행되거나, 가속되거나, 시작되거나, 중지됩니다. |
CurrentStateInvalidated | 시작, 건너뛰어서 채우기, 중지 | 클록이 시작되거나, 중지되거나, 채워집니다. |
CurrentTimeInvalidated | 시작, 검색, 건너뛰어서 채우기, 중지 | 클록이 진행됩니다. |
RemoveRequested | 제거 |
틱 및 이벤트 통합
WPF에서 개체에 애니메이션 효과를 줄 때 애니메이션을 관리하는 것은 바로 타이밍 엔진입니다. 타이밍 엔진은 시간의 진행을 추적하고 각 애니메이션의 상태를 계산합니다. 1초 안에 이러한 많은 계산 패스가 진행됩니다. 이러한 계산 패스를 "틱"이라고 합니다.
틱은 자주 발생하지만 틱 간에 많은 사항이 발생할 수 있습니다. 예를 들어 타임라인이 중지되었다가 시작된 후 다시 중지될 수 있습니다. 이 경우 현재 상태는 3번 변경됩니다. 이론적으로 단일 틱에서 이벤트가 여러 번 발생할 수 있지만 타이밍 엔진은 이벤트를 통합하므로 각 이벤트는 틱마다 한 번만 발생할 수 있습니다.
이벤트 등록
타이밍 이벤트를 등록하는 방법에는 두 가지가 있습니다. 하나는 타임라인에 등록하는 것이고 다른 하나는 타임라인에서 생성된 클록에 등록하는 것입니다. 이벤트를 클록에 직접 등록하는 과정은 매우 간단합니다. 단, 반드시 코드에서만 수행할 수 있다는 단점이 있습니다. 태그 또는 코드에서 타임라인에 이벤트를 등록할 수 있습니다. 다음 섹션에서는 타임라인에 클록 이벤트를 등록하는 방법을 설명합니다.
타임라인에 클록 이벤트 등록
타임라인의 Completed, CurrentGlobalSpeedInvalidated, CurrentStateInvalidated, CurrentTimeInvalidated 및 RemoveRequested 이벤트가 타임라인에 연결된 것처럼 보이지만, 이러한 이벤트에 등록하면 실제로 이벤트 처리기는 타임라인에 대해 만든 Clock과 연결됩니다.
예를 들어 타임라인에서 Completed 이벤트를 등록할 때 실제로는 타임라인에 대해 생성된 각 클록의 Completed 이벤트에 등록하도록 시스템에 지시하는 것입니다. 코드에서는 이 타임라인에 대해 Clock이 생성되기 전에 이 이벤트를 등록해야 합니다. 그렇지 않으면 알림을 받을 수 없습니다. 이 작업은 XAML에서 자동으로 발생합니다. 파서가 Clock이 생성되기 전에 자동으로 이벤트를 등록합니다.
참고 항목
.NET Desktop feedback