Udostępnij przez


Instrukcje: odbieranie powiadomienia po zmianie stanu zegara

Zdarzenie zegara CurrentStateInvalidated występuje, gdy jego CurrentState staje się nieprawidłowy, na przykład po uruchomieniu lub zatrzymaniu zegara. Możesz zarejestrować się na potrzeby tego wydarzenia bezpośrednio przy użyciu Clocklub zarejestrować się przy użyciu Timeline.

W poniższym przykładzie Storyboard i dwa obiekty DoubleAnimation są używane do animowania szerokości dwóch prostokątów. Zdarzenie CurrentStateInvalidated służy do nasłuchiwania zmian stanu zegara.

Przykład

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  x:Class="Microsoft.Samples.Animation.TimingBehaviors.StateExample"
  Background="LightGray">
  <StackPanel Margin="20">
  
    <TextBlock 
      Name="ParentTimelineStateTextBlock"></TextBlock>
    <TextBlock 
      Name="Animation1StateTextBlock"></TextBlock>
    <Rectangle 
      Name="Rectangle01"
      Width="100" Height="50" Fill="Orange" />    
    <TextBlock Name="Animation2StateTextBlock"></TextBlock>
    <Rectangle 
      Name="Rectangle02"
      Width="100" Height="50" Fill="Gray" />  
      
    <Button Content="Start Animations" Margin="20">
      <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
          <BeginStoryboard>
            <Storyboard RepeatBehavior="2x" AutoReverse="True"
              CurrentStateInvalidated="parentTimelineStateInvalidated" >
              <DoubleAnimation
                Storyboard.TargetName="Rectangle01"
                Storyboard.TargetProperty="Width"
                From="10" To="200" Duration="0:0:9"
                BeginTime="0:0:1" 
                CurrentStateInvalidated="animation1StateInvalidated"/>
              <DoubleAnimation
                Storyboard.TargetName="Rectangle02"
                Storyboard.TargetProperty="Width"
                From="10" To="200" Duration="0:0:8"
                BeginTime="0:0:1" 
                CurrentStateInvalidated="animation2StateInvalidated" />            
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Button.Triggers>
    </Button>
  
  
  </StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace Microsoft.Samples.Animation.TimingBehaviors
{

    public partial class StateExample : Page
    {

        private void parentTimelineStateInvalidated(object sender, EventArgs args)
        {
            Clock myClock = (Clock)sender;
            ParentTimelineStateTextBlock.Text +=
                myClock.CurrentTime.ToString() + ":"
                + myClock.CurrentState.ToString() + " ";
        }

        private void animation1StateInvalidated(object sender, EventArgs args)
        {

            Clock myClock = (Clock)sender;

            Animation1StateTextBlock.Text +=
                myClock.Parent.CurrentTime.ToString() + ":"
                + myClock.CurrentState.ToString() + " ";
        }

        private void animation2StateInvalidated(object sender, EventArgs args)
        {

            Clock myClock = (Clock)sender;
            Animation2StateTextBlock.Text +=
                myClock.Parent.CurrentTime.ToString() + ":"
                + myClock.CurrentState.ToString() + " ";
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation

Namespace Microsoft.Samples.Animation.TimingBehaviors

    Partial Public Class StateExample
        Inherits Page

        Private Sub parentTimelineStateInvalidated(ByVal sender As Object, ByVal args As EventArgs)
            Dim myClock As Clock = CType(sender, Clock)
            ParentTimelineStateTextBlock.Text += myClock.CurrentTime.ToString() & ":" & myClock.CurrentState.ToString() & " "
        End Sub

        Private Sub animation1StateInvalidated(ByVal sender As Object, ByVal args As EventArgs)

            Dim myClock As Clock = CType(sender, Clock)

            Animation1StateTextBlock.Text += myClock.Parent.CurrentTime.ToString() & ":" & myClock.CurrentState.ToString() & " "
        End Sub

        Private Sub animation2StateInvalidated(ByVal sender As Object, ByVal args As EventArgs)

            Dim myClock As Clock = CType(sender, Clock)
            Animation2StateTextBlock.Text += myClock.Parent.CurrentTime.ToString() & ":" & myClock.CurrentState.ToString() & " "
        End Sub
    End Class
End Namespace

Na poniższej ilustracji przedstawiono różne stany, w które wchodzą animacje, gdy oś czasu nadrzędnego (Storyboard) postępuje.

stany zegara dla Scenorysu z dwiema animacjami

Poniższa tabela pokazuje czasy, w których zdarzenie dla CurrentStateInvalidatedzostaje uruchomione.

Czas (sekundy) Państwo
1 Aktywny
10 Aktywny
19 Zatrzymano
dwadzieścia jeden Aktywny
30 Aktywny
39 Zatrzymano

W poniższej tabeli przedstawiono czasy, o których uruchamiane jest zdarzenie w CurrentStateInvalidated.

Czas (sekundy) Państwo
1 Aktywny
9 Nadzienie
11 Aktywny
19 Zatrzymano
dwadzieścia jeden Aktywny
29 Nadzienie
31 Aktywny
39 Zatrzymano

Zwróć uwagę, że zdarzenie Animation1CurrentStateInvalidated wyzwala się po 10 sekundach, mimo że jego stan pozostaje Active. To dlatego, że jego stan zmienił się w czasie 10 sekund, ale zmienił się z Active na Filling, a następnie z powrotem na Active w tym samym cyklu.