Windows Phone - 点击弹出动画
Windows Phone - popup animation on tap
我正在制作一个带有滑入和滑出效果的弹出窗口。
我想出了 "in" 部分。我添加了一个 EventTrigger 以在控件的网格加载时开始故事板。
<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 命令绑定到点击事件以关闭弹出窗口:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Tap">
<cmd:EventToCommand Command="{Binding DismissCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
此命令也用于此网格下方的按钮(在 "LayoutRoot" 主网格中)。
所有这些都很好。
问题来了 - 我需要在弹出窗口关闭之前添加一个 "slide-out" 动画。我无法添加
<EventTrigger RoutedEvent="Grid.Tap">
因为我在启动时遇到 xaml 解析异常:
Additional information: Failed to assign to property 'System.Windows.EventTrigger.RoutedEvent'.
我尝试向整个控件添加一个 "Tap" 事件处理程序,但似乎 ViewModel 命令首先被触发并关闭了整个弹出窗口。
关于如何将它们组合在一起的任何想法?
所以我也弄明白了,以防有人感兴趣。
在每个按钮的 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 真正关心的问题,所以我将保持原样。
我正在制作一个带有滑入和滑出效果的弹出窗口。
我想出了 "in" 部分。我添加了一个 EventTrigger 以在控件的网格加载时开始故事板。
<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 命令绑定到点击事件以关闭弹出窗口:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Tap">
<cmd:EventToCommand Command="{Binding DismissCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
此命令也用于此网格下方的按钮(在 "LayoutRoot" 主网格中)。
所有这些都很好。
问题来了 - 我需要在弹出窗口关闭之前添加一个 "slide-out" 动画。我无法添加
<EventTrigger RoutedEvent="Grid.Tap">
因为我在启动时遇到 xaml 解析异常:
Additional information: Failed to assign to property 'System.Windows.EventTrigger.RoutedEvent'.
我尝试向整个控件添加一个 "Tap" 事件处理程序,但似乎 ViewModel 命令首先被触发并关闭了整个弹出窗口。
关于如何将它们组合在一起的任何想法?
所以我也弄明白了,以防有人感兴趣。
在每个按钮的 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 真正关心的问题,所以我将保持原样。