ClockController.SeekAlignedToLastTick(TimeSpan, TimeSeekOrigin) 方法

定义

立即根据指定的量查找目标 ClockSeeks the target Clock by the specified amount immediately. 如果目标时钟已停止,则查找会使它再次处于活动状态。If the target clock is stopped, seeking makes it active again.

public:
 void SeekAlignedToLastTick(TimeSpan offset, System::Windows::Media::Animation::TimeSeekOrigin origin);
public void SeekAlignedToLastTick (TimeSpan offset, System.Windows.Media.Animation.TimeSeekOrigin origin);
member this.SeekAlignedToLastTick : TimeSpan * System.Windows.Media.Animation.TimeSeekOrigin -> unit
Public Sub SeekAlignedToLastTick (offset As TimeSpan, origin As TimeSeekOrigin)

参数

offset
TimeSpan

查找偏移量,以目标时钟的时间为单位。The seek offset, measured in the target clock's time. 此偏移量相对于时钟的 BeginTimeDuration,具体取决于 origin 的值。This offset is relative to the clock's BeginTime or Duration, depending on the value of origin.

origin
TimeSeekOrigin

一个值,指示指定的偏移量是否相对于目标时钟的 BeginTimeDurationA value that indicates whether the specified offset is relative to the target clock's BeginTime or Duration.

示例

下面的示例演示Seek了的和SeekAlignedToLastTick方法。 ClockControllerThe following example demonstrates both the Seek and SeekAlignedToLastTick methods of a ClockController.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Xml;
using System.Configuration;



namespace SDKSample
{
    /// <summary>
    /// Shows how to interactively control a clock.
    /// </summary>

  public class SeekAlignedToLastTickExample : Page
    {
    
        private AnimationClock myClock;
        private TextBlock currentTimeIndicator;
        private TextBox seekDestination;
        private TextBlock rectangleWidthIndicator;
        private Rectangle myRectangle;
        
        public SeekAlignedToLastTickExample()
        {
        
 
        
            this.WindowTitle = "Controlling a Storyboard";
            this.Background = Brushes.White;

            StackPanel myStackPanel = new StackPanel();
            myStackPanel.Margin = new Thickness(20);
            
            // Create a rectangle.
            myRectangle = new Rectangle();
            myRectangle.Width = 100;
            myRectangle.Height = 20;
            myRectangle.Margin = new Thickness(12,0,0,5);
            myRectangle.Fill = new SolidColorBrush(Color.FromArgb(170, 51, 51, 255));
            myRectangle.HorizontalAlignment = HorizontalAlignment.Left;
            myStackPanel.Children.Add(myRectangle);                    
            
            //
            // Create an animation and a storyboard to animate the
            // rectangle.
            //
            DoubleAnimation myDoubleAnimation = 
                new DoubleAnimation(100, 500, new Duration(TimeSpan.FromSeconds(60)));  
            myClock = myDoubleAnimation.CreateClock();
            myRectangle.ApplyAnimationClock(Rectangle.WidthProperty, myClock);
            myClock.Controller.Stop();
 
            
            //
            // Create some buttons to control the storyboard
            // and a panel to contain them.
            //
            StackPanel buttonPanel = new StackPanel();
            buttonPanel.Orientation = Orientation.Horizontal;
            Button beginButton = new Button();
            beginButton.Content = "Begin";
            beginButton.Click += new RoutedEventHandler(beginButton_Clicked);            
            buttonPanel.Children.Add(beginButton);
            Button pauseButton = new Button();
            pauseButton.Content = "Pause";
            pauseButton.Click +=new RoutedEventHandler(pauseButton_Clicked);
            buttonPanel.Children.Add(pauseButton);
            Button resumeButton = new Button();
            resumeButton.Content = "Resume";
            resumeButton.Click +=new RoutedEventHandler(resumeButton_Clicked);
            buttonPanel.Children.Add(resumeButton);
            Button skipToFillButton = new Button();
            skipToFillButton.Content = "Skip to Fill";
            skipToFillButton.Click +=new RoutedEventHandler(skipToFillButton_Clicked);
            buttonPanel.Children.Add(skipToFillButton);
            Button setSpeedRatioButton = new Button();
            setSpeedRatioButton.Content = "Triple Speed";
            setSpeedRatioButton.Click +=new RoutedEventHandler(setSpeedRatioButton_Clicked);
            buttonPanel.Children.Add(setSpeedRatioButton);
            Button stopButton = new Button();
            stopButton.Content = "Stop";
            stopButton.Click +=new RoutedEventHandler(stopButton_Clicked);
            buttonPanel.Children.Add(stopButton);
            Button removeButton = new Button();
            removeButton.Content = "Remove";
            removeButton.Click +=new RoutedEventHandler(removeButton_Clicked);
            buttonPanel.Children.Add(removeButton);            
            
            myStackPanel.Children.Add(buttonPanel);    
            
            // Create some controls to display the
            // storyboard's current time and the
            // current width of the rectangle.
            StackPanel seekPanel = new StackPanel();
            seekPanel.Margin = new Thickness(10);
            StackPanel aPanel = new StackPanel();
            Label aLabel = new Label();
            aPanel.Orientation = Orientation.Horizontal;
            aLabel.Content = "Current Time: ";
            aPanel.Children.Add(aLabel);
            currentTimeIndicator = new TextBlock();
            aPanel.Children.Add(currentTimeIndicator);
            seekPanel.Children.Add(aPanel);
            
            aPanel = new StackPanel();
            aPanel.Orientation = Orientation.Horizontal;
            aLabel = new Label();
            aLabel.Content = "Rectangle Width: ";
            aPanel.Children.Add(aLabel);
            rectangleWidthIndicator = new TextBlock();
            rectangleWidthIndicator.Text = myRectangle.Width.ToString(); 
            aPanel.Children.Add(rectangleWidthIndicator);
            seekPanel.Children.Add(aPanel);
            
            
            // Create some controls to enable the
            // user to specify a seek position.
            
            aPanel = new StackPanel();
            aPanel.Orientation = Orientation.Horizontal;
            aLabel = new Label();
            aLabel.Content = "Seek Offset: " ;
            aPanel.Children.Add(aLabel);
            seekDestination = new TextBox();
            seekDestination.Text = "0";
            aPanel.Children.Add(seekDestination);       
            seekPanel.Children.Add(aPanel);
            
            
            Button seekButton = new Button();
            seekButton.Content = "Seek";
            seekButton.Click += new RoutedEventHandler(seekButton_Clicked);
            seekPanel.Children.Add(seekButton);
            Button seekAlignedToLastTickButton = new Button();
            seekAlignedToLastTickButton.Content = "Seek Aligned to Last Tick";
            seekAlignedToLastTickButton.Click += new RoutedEventHandler(seekAlignedToLastTickButton_Clicked);
            seekPanel.Children.Add(seekAlignedToLastTickButton);           
            
            myStackPanel.Children.Add(seekPanel);
            
            this.Content = myStackPanel;   
            
            myClock.CurrentTimeInvalidated += new EventHandler(myClock_CurrentTimeInvalidated);
        }
        
        // Begins the clock.
        private void beginButton_Clicked(object sender, RoutedEventArgs args)
        {

            myClock.Controller.Begin();         
        }
        
        // Pauses the clock.
        private void pauseButton_Clicked(object sender, RoutedEventArgs args)
        {
            myClock.Controller.Pause();         
        
        }

        // Resumes the clock.
        private void resumeButton_Clicked(object sender, RoutedEventArgs args)
        {
            myClock.Controller.Resume();        
        
        }

        // Advances the clock to its fill period.
        private void skipToFillButton_Clicked(object sender, RoutedEventArgs args)
        {
            myClock.Controller.SkipToFill();          
        
        }

        // Updates the clock's speed.
        private void setSpeedRatioButton_Clicked(object sender, RoutedEventArgs args)
        {
            // Makes the clock progress three times as fast as normal.
            myClock.Controller.SpeedRatio = 3;        
        
        }

        // Stops the clock.
        private void stopButton_Clicked(object sender, RoutedEventArgs args)
        {
            myClock.Controller.Stop();        
        
        }

        // Removes the clock.
        private void removeButton_Clicked(object sender, RoutedEventArgs args)
        {
            myClock.Controller.Remove();        
        
        }        
        
        private void seekButton_Clicked(object sender, RoutedEventArgs args)
        {
            try {
            
                // The rectangle width will probably not be at its new
                // value when this call is made, because the 
                // clock probably hasn't ticked yet.
                TimeSpan seekTime = TimeSpan.Parse(seekDestination.Text);
                myClock.Controller.Seek(seekTime, TimeSeekOrigin.BeginTime);
                rectangleWidthIndicator.Text = myRectangle.Width.ToString();
            
            }catch(FormatException ex)
            {
                MessageBox.Show("Invalid TimeSpan value.");
                seekDestination.Focus();
            }
        }
        
        private void seekAlignedToLastTickButton_Clicked(object sender, RoutedEventArgs args)
        {

            try {
            
                // The rectangle width will be at its new
                // value when this call is made, because SeekAlignedToLastTick 
                // operation immediately updates timeline and animation
                // values.        
                TimeSpan seekTime = TimeSpan.Parse(seekDestination.Text);
                myClock.Controller.SeekAlignedToLastTick(seekTime, TimeSeekOrigin.BeginTime);
                rectangleWidthIndicator.Text = myRectangle.Width.ToString();
            
            }catch(FormatException ex)
            {
                MessageBox.Show("Invalid TimeSpan value.");
                seekDestination.Focus();
            }    
        }
        
        private void myClock_CurrentTimeInvalidated(object sender, EventArgs e)
        {
        
            currentTimeIndicator.Text = myClock.CurrentTime.ToString();
            
        }
        
        
        
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Imports System.Data
Imports System.Xml
Imports System.Configuration



Namespace SDKSample
    ''' <summary>
    ''' Shows how to interactively control a clock.
    ''' </summary>

  Public Class SeekAlignedToLastTickExample
      Inherits Page

        Private myClock As AnimationClock
        Private currentTimeIndicator As TextBlock
        Private seekDestination As TextBox
        Private rectangleWidthIndicator As TextBlock
        Private myRectangle As Rectangle

        Public Sub New()



            Me.WindowTitle = "Controlling a Storyboard"
            Me.Background = Brushes.White

            Dim myStackPanel As New StackPanel()
            myStackPanel.Margin = New Thickness(20)

            ' Create a rectangle.
            myRectangle = New Rectangle()
            With myRectangle
                .Width = 100
                .Height = 20
                .Margin = New Thickness(12, 0, 0, 5)
                .Fill = New SolidColorBrush(Color.FromArgb(170, 51, 51, 255))
                .HorizontalAlignment = HorizontalAlignment.Left
            End With
            myStackPanel.Children.Add(myRectangle)

            '
            ' Create an animation and a storyboard to animate the
            ' rectangle.
            '
            Dim myDoubleAnimation As New DoubleAnimation(100, 500, New Duration(TimeSpan.FromSeconds(60)))
            myClock = myDoubleAnimation.CreateClock()
            myRectangle.ApplyAnimationClock(Rectangle.WidthProperty, myClock)
            myClock.Controller.Stop()


            '
            ' Create some buttons to control the storyboard
            ' and a panel to contain them.
            '
            Dim buttonPanel As New StackPanel()
            buttonPanel.Orientation = Orientation.Horizontal
            Dim beginButton As New Button()
            beginButton.Content = "Begin"
            AddHandler beginButton.Click, AddressOf beginButton_Clicked
            buttonPanel.Children.Add(beginButton)
            Dim pauseButton As New Button()
            pauseButton.Content = "Pause"
            AddHandler pauseButton.Click, AddressOf pauseButton_Clicked
            buttonPanel.Children.Add(pauseButton)
            Dim resumeButton As New Button()
            resumeButton.Content = "Resume"
            AddHandler resumeButton.Click, AddressOf resumeButton_Clicked
            buttonPanel.Children.Add(resumeButton)
            Dim skipToFillButton As New Button()
            skipToFillButton.Content = "Skip to Fill"
            AddHandler skipToFillButton.Click, AddressOf skipToFillButton_Clicked
            buttonPanel.Children.Add(skipToFillButton)
            Dim setSpeedRatioButton As New Button()
            setSpeedRatioButton.Content = "Triple Speed"
            AddHandler setSpeedRatioButton.Click, AddressOf setSpeedRatioButton_Clicked
            buttonPanel.Children.Add(setSpeedRatioButton)
            Dim stopButton As New Button()
            stopButton.Content = "Stop"
            AddHandler stopButton.Click, AddressOf stopButton_Clicked
            buttonPanel.Children.Add(stopButton)
            Dim removeButton As New Button()
            removeButton.Content = "Remove"
            AddHandler removeButton.Click, AddressOf removeButton_Clicked
            buttonPanel.Children.Add(removeButton)

            myStackPanel.Children.Add(buttonPanel)

            ' Create some controls to display the
            ' storyboard's current time and the
            ' current width of the rectangle.
            Dim seekPanel As New StackPanel()
            seekPanel.Margin = New Thickness(10)
            Dim aPanel As New StackPanel()
            Dim aLabel As New Label()
            aPanel.Orientation = Orientation.Horizontal
            aLabel.Content = "Current Time: "
            aPanel.Children.Add(aLabel)
            currentTimeIndicator = New TextBlock()
            aPanel.Children.Add(currentTimeIndicator)
            seekPanel.Children.Add(aPanel)

            aPanel = New StackPanel()
            aPanel.Orientation = Orientation.Horizontal
            aLabel = New Label()
            aLabel.Content = "Rectangle Width: "
            aPanel.Children.Add(aLabel)
            rectangleWidthIndicator = New TextBlock()
            rectangleWidthIndicator.Text = myRectangle.Width.ToString()
            aPanel.Children.Add(rectangleWidthIndicator)
            seekPanel.Children.Add(aPanel)


            ' Create some controls to enable the
            ' user to specify a seek position.

            aPanel = New StackPanel()
            aPanel.Orientation = Orientation.Horizontal
            aLabel = New Label()
            aLabel.Content = "Seek Offset: "
            aPanel.Children.Add(aLabel)
            seekDestination = New TextBox()
            seekDestination.Text = "0"
            aPanel.Children.Add(seekDestination)
            seekPanel.Children.Add(aPanel)


            Dim seekButton As New Button()
            seekButton.Content = "Seek"
            AddHandler seekButton.Click, AddressOf seekButton_Clicked
            seekPanel.Children.Add(seekButton)
            Dim seekAlignedToLastTickButton As New Button()
            seekAlignedToLastTickButton.Content = "Seek Aligned to Last Tick"
            AddHandler seekAlignedToLastTickButton.Click, AddressOf seekAlignedToLastTickButton_Clicked
            seekPanel.Children.Add(seekAlignedToLastTickButton)

            myStackPanel.Children.Add(seekPanel)

            Me.Content = myStackPanel

            AddHandler myClock.CurrentTimeInvalidated, AddressOf myClock_CurrentTimeInvalidated
        End Sub

        ' Begins the clock.
        Private Sub beginButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)

            myClock.Controller.Begin()
        End Sub

        ' Pauses the clock.
        Private Sub pauseButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myClock.Controller.Pause()

        End Sub

        ' Resumes the clock.
        Private Sub resumeButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myClock.Controller.Resume()

        End Sub

        ' Advances the clock to its fill period.
        Private Sub skipToFillButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myClock.Controller.SkipToFill()

        End Sub

        ' Updates the clock's speed.
        Private Sub setSpeedRatioButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            ' Makes the clock progress three times as fast as normal.
            myClock.Controller.SpeedRatio = 3

        End Sub

        ' Stops the clock.
        Private Sub stopButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myClock.Controller.Stop()

        End Sub

        ' Removes the clock.
        Private Sub removeButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            myClock.Controller.Remove()

        End Sub

        Private Sub seekButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)
            Try

                ' The rectangle width will probably not be at its new
                ' value when this call is made, because the 
                ' clock probably hasn't ticked yet.
                Dim seekTime As TimeSpan = TimeSpan.Parse(seekDestination.Text)
                myClock.Controller.Seek(seekTime, TimeSeekOrigin.BeginTime)
                rectangleWidthIndicator.Text = myRectangle.Width.ToString()

            Catch ex As FormatException
                MessageBox.Show("Invalid TimeSpan value.")
                seekDestination.Focus()
            End Try
        End Sub

        Private Sub seekAlignedToLastTickButton_Clicked(ByVal sender As Object, ByVal args As RoutedEventArgs)

            Try

                ' The rectangle width will be at its new
                ' value when this call is made, because SeekAlignedToLastTick 
                ' operation immediately updates timeline and animation
                ' values.        
                Dim seekTime As TimeSpan = TimeSpan.Parse(seekDestination.Text)
                myClock.Controller.SeekAlignedToLastTick(seekTime, TimeSeekOrigin.BeginTime)
                rectangleWidthIndicator.Text = myRectangle.Width.ToString()

            Catch ex As FormatException
                MessageBox.Show("Invalid TimeSpan value.")
                seekDestination.Focus()
            End Try
        End Sub

        Private Sub myClock_CurrentTimeInvalidated(ByVal sender As Object, ByVal e As EventArgs)

            currentTimeIndicator.Text = myClock.CurrentTime.ToString()

        End Sub



  End Class
End Namespace

注解

Seek SpeedRatio操作不会将此时钟时间线的或SlipBehavior设置视为帐户: 该时钟的时间线的时间SpeedRatio为 1, 而SlipBehavior不是。Seek operations do not take the SpeedRatio or SlipBehavior settings of this clock's timeline into account: the clock is treated as though its timeline has a SpeedRatio of 1 and no SlipBehavior.

SeekAlignedToLastTick将时钟的 seeked 时间与上一个时钟周期对齐。SeekAlignedToLastTick aligns the seeked time of the clock with the last clock tick. 值会立即更新以反映所做的更改SeekAlignedToLastTick, 即使在屏幕更新之前屏幕将不会反映这些更改。Values are immediately updated to reflect the changes due to SeekAlignedToLastTick, even though the screen will not reflect these changes until the screen updates.

如果目标时钟有子级, 则其当前时间将相应更新。If the target clock has children, their current time is updated accordingly.

此方法会将时钟CurrentState更改为。 ActiveThis method changes the clock's CurrentState to Active.

查找情节提要会触发CurrentGlobalSpeedInvalidatedCurrentStateInvalidated事件。Seeking a storyboard triggers the CurrentGlobalSpeedInvalidated and CurrentStateInvalidated events.

适用于