我创建了一个翻转动画,从项目列表转到编辑对话框。例如,用户会看到一个项目列表,双击某个项目进行编辑,然后屏幕翻转以显示包含详细信息的编辑对话框。
我有实际的动画工作,除了屏幕上的项目有点模糊。当我回到那个也模糊的列表时。
任何人都可以提出原因。我已经在下面展示了我是如何实现翻转的。
<ContentControl x:Name="EditPtrMainContent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ContentControl.Resources>
<Storyboard x:Name="FlipToEditStart">
<DoubleAnimation From="0" To="90" Duration="0:0:0.3" Storyboard.TargetName="ContentProjection" Storyboard.TargetProperty="RotationY"/>
</Storyboard>
<Storyboard x:Name="FlipToEditEnd">
<DoubleAnimation From="270" To="360" Duration="0:0:0.3" Storyboard.TargetName="ContentProjection" Storyboard.TargetProperty="RotationY"/>
</Storyboard>
<Storyboard x:Name="FlipToListStart">
<DoubleAnimation From="0" To="-90" Duration="0:0:0.3" Storyboard.TargetName="ContentProjection" Storyboard.TargetProperty="RotationY"/>
</Storyboard>
<Storyboard x:Name="FlipToListEnd">
<DoubleAnimation From="-270" To="-360" Duration="0:0:0.3" Storyboard.TargetName="ContentProjection" Storyboard.TargetProperty="RotationY"/>
</Storyboard>
</ContentControl.Resources>
<ContentControl.Projection>
<PlaneProjection x:Name="ContentProjection"/>
</ContentControl.Projection>
</ContentControl>
在代码隐藏中(本质上是一个MVVM应用程序,但我很高兴动画控件在视图中,因为它是可视的)
public EditPtrView()
{
InitializeComponent();
Loaded += OnLoaded;
Unloaded += OnUnloaded;
FlipToEditStart.Completed += OnFlipToEditStartCompleted;
FlipToListStart.Completed += OnFlipToListStartCompleted;
}
void OnFlipToListStartCompleted(object sender, EventArgs e)
{
EditPtrMainContent.Content = new EditPtrView();
FlipToListEnd.Begin();
}
void OnFlipToEditStartCompleted(object sender, EventArgs e)
{
EditPtrMainContent.Content = new NamedTransferView();
FlipToEditEnd.Begin();
}
void OnLoaded(object sender, RoutedEventArgs e)
{
// register for MVVM Light messages
AppMessages.SetFocusMessage.Register(this, OnSetFocus);
AppMessages.CloseScreenMessage.Register(this, OnCloseScreen);
AppMessages.ViewLoadedMessage.Send(ViewTypes.BookingsListView);
}
void OnUnloaded(object sender, RoutedEventArgs e)
{
AppMessages.SetFocusMessage.Unregister(this, OnSetFocus);
AppMessages.CloseScreenMessage.Unregister(this, OnCloseScreen);
}
#region MVVM Light Message Delegates
private void OnCloseScreen(string screenName)
{
switch (screenName)
{
case "PtrEdit":
FlipToListStart.Begin();
break;
}
}
#endregion
private void TransfersDataGridDoubleClick(object sender, MouseButtonEventArgs e)
{
ShowEditScreen();
}
private void EditPtrButtonClick(object sender, RoutedEventArgs e)
{
ShowEditScreen();
}
private void ShowEditScreen()
{
FlipToEditStart.Begin();
}
正如您所看到的,我在双击(或按钮单击)并动画为90度时启动动画的前半部分。然后,当此动画完成时,我将ContentControl的内容更改为新屏幕,并开始第二个动画从270度到360度。通过编辑屏幕上的MVVM Light Messenger调用,我会执行反向动画以返回列表。所有这些都可以,但正如我所说,屏幕稍微模糊了。我不是在想象它,因为编辑屏幕是一个View / ViewModel,它也在其他地方使用,因此很容易比较。 是否需要在动画结束时正确地重绘屏幕?
答案 0 :(得分:2)
添加以下事件处理程序。 -360或360度旋转会导致问题,并且必须在动画后用0替换。
FlipToEditEnd.Completed += (a, b) => { ContentProjection.RotationY = 0.0; };
FlipToListEnd.Completed += (a, b) => { ContentProjection.RotationY = 0.0; };