我创建了一个翻转动画,可以从项目列表转到编辑对话框。例如,用户看到项目列表,双击项目进行编辑,屏幕翻转以显示包含详细信息的编辑对话框。
我有实际的动画工作,除了屏幕上的项目略微模糊。当我翻回列表时,它也模糊了。
谁能提出原因。我在下面展示了我是如何实现翻转的。
<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 调用,我执行反向动画以返回到列表。所有这些都工作正常,但正如我所说,屏幕略微模糊。我不是在想象它,因为编辑屏幕是一个视图/视图模型,也在其他地方使用,因此很容易比较。动画结束时是否需要执行某些操作才能正确重绘屏幕?
添加以下事件处理程序。 -360 度或 360 度旋转会导致问题,必须在动画后替换为 0。
FlipToEditEnd.Completed += (a, b) => { ContentProjection.RotationY = 0.0; };
FlipToListEnd.Completed += (a, b) => { ContentProjection.RotationY = 0.0; };