多个StoryBoard动画根据控制条件进行播放,以2个StoryBoard为例,分如下几种控制状况:
1.StoryBoard1播放结束后自动启动StoryBoard2的播放;
2.在播放StoryBoard1的过程中用户触发控制事件直接跳到StoryBoard2进行播放;
3.在播放StoryBoard2的过程中用户触发控制事件返回StoryBoard1进行重新播放;
主要以C#后台控制为主
首先启动StoryBoard1进行播放,为了能够对StoryBoard动画进行控制,在启动StoryBoard的时候必须调用相应的开始函数,使StoryBoard处于可控状态,通过参数TimeSpan tsDuration 来控制动画播放的长度,为了使动画在播放到指定位置之后停在当前位置,必须设置动画时间线属性为:
<Storyboard x:Key="Storyboard1" FillBehavior = "HoldEnd">
使动画时间线完成时不改变属性值
private void StartStoryBorad1( TimeSpan tsDuration )
Run1.Duration = tsDuration ;
Run1.Begin(this, true);
}
// Summary:
// Applies the animations associated with this System.Windows.Media.Animation.Storyboard
// to their targets and initiates them.
//
// Parameters:
// containingObject:
// An object contained within the same name scope as the targets of this storyboard's
// animations. Animations without a System.Windows.Media.Animation.Storyboard.TargetName
// are applied to containingObject.
//
// isControllable:
// true if the storyboard should be interactively controllable; otherwise, false.
//public void Begin(FrameworkElement containingObject, bool isControllable);
需要为StoryBoard1定义Completed事件如下:
private void Storyboard1_Completed(object sender, EventArgs e)
{
Storyboard Run1 = FindResource("Storyboard1") as Storyboard;
Run1.Stop( this );
StartStoryBoard2();//启动StoryBoard2,定义同StartStoryBoard1()
}
当指定时间tsDuration小于StoryBoard1的TimelineGroup的Duration时,StoryBoard仍然会触发Completed事件,但是Storyboard1_Completed中调用了Storyboard1.Stop(this),这个调用会使StoryBoard1动画返回到初始状态,这点必须注意。
在StoryBoard1中用户触发事件,使动画StoryBoard1在播放完成之前跳到StoryBoard2:
private void Stage1To2_Click(object sender, System.Windows.RoutedEventArgs e)
{
Storyboard1_Completed(null,null);
}
在StoryBoard2中用户触发事件,使动画StoryBoard2在播放到指定位置之前跳到StoryBoard1:
private void btnStage2To1_Click(object sender, System.Windows.RoutedEventArgs e)
{
}
1.StoryBoard1播放结束后自动启动StoryBoard2的播放;
2.在播放StoryBoard1的过程中用户触发控制事件直接跳到StoryBoard2进行播放;
3.在播放StoryBoard2的过程中用户触发控制事件返回StoryBoard1进行重新播放;
主要以C#后台控制为主
首先启动StoryBoard1进行播放,为了能够对StoryBoard动画进行控制,在启动StoryBoard的时候必须调用相应的开始函数,使StoryBoard处于可控状态,通过参数TimeSpan tsDuration 来控制动画播放的长度,为了使动画在播放到指定位置之后停在当前位置,必须设置动画时间线属性为:
<Storyboard x:Key="Storyboard1" FillBehavior = "HoldEnd">
使动画时间线完成时不改变属性值
private void StartStoryBorad1( TimeSpan tsDuration )
{
Storyboard Run1 = FindResource("Storyboard1") as Storyboard;
Run1.BeginTime = TimeSpan.FromSeconds(0);Run1.Duration = tsDuration ;
Run1.Begin(this, true);
}
// Summary:
// Applies the animations associated with this System.Windows.Media.Animation.Storyboard
// to their targets and initiates them.
//
// Parameters:
// containingObject:
// An object contained within the same name scope as the targets of this storyboard's
// animations. Animations without a System.Windows.Media.Animation.Storyboard.TargetName
// are applied to containingObject.
//
// isControllable:
// true if the storyboard should be interactively controllable; otherwise, false.
//public void Begin(FrameworkElement containingObject, bool isControllable);
需要为StoryBoard1定义Completed事件如下:
private void Storyboard1_Completed(object sender, EventArgs e)
{
Storyboard Run1 = FindResource("Storyboard1") as Storyboard;
Run1.Stop( this );
StartStoryBoard2();//启动StoryBoard2,定义同StartStoryBoard1()
}
当指定时间tsDuration小于StoryBoard1的TimelineGroup的Duration时,StoryBoard仍然会触发Completed事件,但是Storyboard1_Completed中调用了Storyboard1.Stop(this),这个调用会使StoryBoard1动画返回到初始状态,这点必须注意。
在StoryBoard1中用户触发事件,使动画StoryBoard1在播放完成之前跳到StoryBoard2:
private void Stage1To2_Click(object sender, System.Windows.RoutedEventArgs e)
{
Storyboard1_Completed(null,null);
}
在StoryBoard2中用户触发事件,使动画StoryBoard2在播放到指定位置之前跳到StoryBoard1:
private void btnStage2To1_Click(object sender, System.Windows.RoutedEventArgs e)
{
Storyboard Run1 = FindResource("Storyboard2") as Storyboard;
Run1.Stop( this );
StartStoryBoard1();}
以上控制基于Blend3实现。