Я создал флип-анимацию для перехода от списка элементов к диалогу редактирования. Например, пользователь видит список элементов, дважды щелкает элемент, чтобы отредактировать его, и экран переворачивается, чтобы отобразить диалог редактирования с подробной информацией.
Реальная анимация работает за исключением того, что элементы на экране слегка размыты. Когда я возвращаюсь к списку, он также размыт.
Может кто-нибудь предложить причину этого. Ниже я показал, как я достиг флип.
<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, который также используется в другом месте, и поэтому его легко сравнивать.
Есть ли что-то, что нужно сделать в конце анимации, чтобы правильно перерисовать экран?