Windows Phone -点击弹出动画

本文关键字:动画 Phone -点 Windows | 更新日期: 2023-09-27 18:19:25

我正在制作一个带有滑入和滑出效果的弹出窗口。
我明白了"在"的部分。我添加了一个EventTrigger来在控件的网格加载时启动storyboard。

<Grid.Triggers>
    <EventTrigger RoutedEvent="Grid.Loaded">
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimation Storyboard.TargetName="SlideTransform"
                                 Storyboard.TargetProperty="Y"
                                 From="1000" To="0" Duration="0:0:0.25"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Grid.Triggers>
<Grid.RenderTransform>
    <TranslateTransform x:Name="SlideTransform" Y="1000"/>
</Grid.RenderTransform>

我还绑定了一个ViewModel命令到tap事件来关闭弹出:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Tap">
        <cmd:EventToCommand Command="{Binding DismissCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

此命令也可用于放置在此网格下方的按钮(在"LayoutRoot"主网格中)。
所有这些都很好。

现在问题来了——我需要在弹出窗口关闭前添加一个"滑出"动画。我不能添加

<EventTrigger RoutedEvent="Grid.Tap">

因为我在启动时得到一个xaml解析异常:

附加信息:分配属性'System.Windows.EventTrigger.RoutedEvent'失败。

我尝试添加一个"点击"事件处理程序到整个控件,但似乎ViewModel命令首先被触发并关闭整个弹出窗口。
有什么好主意吗?

Windows Phone -点击弹出动画

所以我也算出来了,以防有人感兴趣。
对于每个按钮的Tap事件,我调用一个方法,该方法准备并触发动画:

private void DismissButton_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    this.dismissAll = false;
    this.PrepareAndStartSlideOutAnimation();
}
private void DismissAllButton_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    this.dismissAll = true;
    this.PrepareAndStartSlideOutAnimation();
}
private void PrepareAndStartSlideOutAnimation()
{
    Storyboard s = new Storyboard();
    DoubleAnimation animation = new DoubleAnimation();
    animation.From = 0;
    animation.To = 1000;
    animation.Duration = new Duration(TimeSpan.FromMilliseconds(250));
    LayoutRoot.RenderTransform = new CompositeTransform();
    Storyboard.SetTarget(animation, LayoutRoot);
    Storyboard.SetTargetProperty(animation, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)"));
    s.Completed += SlideOutAnimation_Completed;
    s.Children.Add(animation);
    s.Begin();
}

动画完成后,我执行来自DataContext的命令:

private void SlideOutAnimation_Completed(object sender, EventArgs e)
{
    if (!this.dismissAll)
        (this.DataContext as HelpOverlayControlViewModel).DismissCommand.Execute(null);
    else
        (this.DataContext as HelpOverlayControlViewModel).DismissAllCommand.Execute(null);
}

这不是最"MVVMy"的解决方案,但我想弹出动画并不是真正的ViewModel的关注,所以我将离开它,因为它是