C#-Windows Phone 8,在更改元素的可见性之前,如何首先启动动画或故事板
我有一个问题,如何在XAML元素的可见性更改之前使动画首先运行? 情况应该是这样的C#-Windows Phone 8,在更改元素的可见性之前,如何首先启动动画或故事板,c#,animation,windows-phone-8,windows-phone,C#,Animation,Windows Phone 8,Windows Phone,我有一个问题,如何在XAML元素的可见性更改之前使动画首先运行? 情况应该是这样的 <Grid Name=Header Visiblity="visible"> <Grid.Resources> <Storyboard x:Name="HeaderGridUp"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Height"
<Grid Name=Header Visiblity="visible">
<Grid.Resources>
<Storyboard x:Name="HeaderGridUp">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="Height"
Storyboard.TargetName="HeaderGrid">
<EasingDoubleKeyFrame Value="30" KeyTime="00:00:02">
<EasingDoubleKeyFrame.EasingFunction>
<ExponentialEase EasingMode="EaseOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="HeaderGridDown">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="Height"
Storyboard.TargetName="HeaderGrid">
<EasingDoubleKeyFrame Value="30" KeyTime="00:00:02">
<EasingDoubleKeyFrame.EasingFunction>
<ExponentialEase EasingMode="EaseIn"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Grid.Resources>
</Grid>
在我的例子中,我想要一个像淡入淡出一样移动的动画,这就是为什么我每个网格制作两个故事板。我想让我的应用程序运行的第一件事是。
HeaderGrid
的当前状态可见,当我按下一个按钮时,该网格将上升,可见性变为折叠。在这之后,ItemsGrid
将上升以更改其可见性,然后上升以替换HeaderGrid
原始位置。然后我做精确的还原。
我可以这样做吗?我想在代码隐藏中完成它。
如有任何答复,将不胜感激。:)
多谢各位
问候,
Budi Prasetyo一旦将任何元素的可见性设置为折叠,您将无法看到任何动画,因为该元素已折叠。我自己也遇到了这个问题,想在列表中的项目消失时缓解一下。我的解决方案是在ViewModel中添加另一个属性IsRemoving,然后在删除元素之前将其设置为true。然后,可以将动画绑定到IsRemoving属性的更改,以便在设置元素的可见性之前运行动画 您可以使用一些异步/等待魔法来完成这样的操作。这将在实际移除项目之前延迟1秒。由于等待延迟,UI将不会挂起
public async void RemoveItem(SomeItem item){
IsRemoving = true;
await Task.Delay(1000);
<Your collection>.Remove(item);
IsRemoving = false;
}
public异步void removietem(SomeItem){
IsRemoving=真;
等待任务。延迟(1000);
.删除(项目);
IsRemoving=false;
}
编辑:在XAML中:
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsRemoving}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="border">
<EasingDoubleKeyFrame KeyTime="0" Value="1">
<EasingDoubleKeyFrame.EasingFunction>
<QuinticEase EasingMode="EaseOut"></QuinticEase>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0">
<EasingDoubleKeyFrame.EasingFunction>
<QuinticEase EasingMode="EaseOut"></QuinticEase>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
希望它有帮助:-)在你应该在c#中添加可见性代码的地方,你启动一个调度程序,时间间隔等于你的动画长度,并且当计时器滴答声改变可见性时
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0,0,x); //length of your animation in seconds
大体上
以及勾号的事件处理程序
void timer_Tick(object sender, EventArgs e)
{
timer.Stop();
element.Visibility = Visibility.Visible; //or Collapsed
}
如果要更改元素的可见性,只需启动计时器
timer.Start();
希望有帮助:)不要太晚;) 仍然困惑,你能举一个使用我的代码的例子吗??事实上,我试过你的解决办法。我试过这样做<代码>HeaderGridUp.Begin()代码>
等待任务。延迟(5000)代码>HeaderGrid.Visibility=Visibility.Collapsed代码>ItemsGrid.Visibility=可见性.Visibility代码>ItemsGridUp.Begin()代码>但是。它不起作用。我犯了什么错误吗?问题是我没有用代码启动动画,它完全是XAML情节提要,带有一个DataTrigger,监听IsRemoving属性使之变为真。然后,当动画运行时(例如0-1秒),您等待一个任务。在删除该项目之前延迟(1000)左右。这样,在移除项之前动画在另一个属性上运行在我的例子中,我不使用数据模板,而是在网格中使用它。所以这就是为什么我不能用你的方法t_THi Budi Prasetyo,你有解决办法吗。我需要类似的动画,我必须在网格上的可见性改变之前设置动画。谢谢
void timer_Tick(object sender, EventArgs e)
{
timer.Stop();
element.Visibility = Visibility.Visible; //or Collapsed
}
timer.Start();