C#-Windows Phone 8,在更改元素的可见性之前,如何首先启动动画或故事板

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"

我有一个问题,如何在XAML元素的可见性更改之前使动画首先运行? 情况应该是这样的

<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();