Я пытался выяснить, как эффективно запускать анимацию в представлении, когда свойство в модели представления обновляется, когда анимация зависит от значения указанного свойства.
Я воссоздал свою проблему в простом приложении с одним View и ViewModel. Цель здесь - передать изменение цвета прямоугольника с помощью ColorAnimation. Для справки я использовал пакет MVVM Foundation Джоша Смита.
Пример проекта можно здесь.
Подводя итог, я хочу анимировать переход цвета в представлении при изменении свойства Color.
MainWindow.xaml
<Window x:Class="MVVM.ColorAnimation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ColorAnimation="clr-namespace:MVVM.ColorAnimation" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<ColorAnimation:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Rectangle Margin="10">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Color}"/>
</Rectangle.Fill>
</Rectangle>
<StackPanel Orientation="Horizontal" Grid.Row="1">
<Button Command="{Binding BlueCommand}" Width="100">Blue</Button>
<Button Command="{Binding GreenCommand}" Width="100">Green</Button>
</StackPanel>
</Grid>
</Window>
MainWindowViewModel.cs
namespace MVVM.ColorAnimation
{
using System.Windows.Input;
using System.Windows.Media;
using MVVM;
public class MainWindowViewModel : ObservableObject
{
private ICommand blueCommand;
private ICommand greenCommand;
public ICommand BlueCommand
{
get
{
return this.blueCommand ?? (this.blueCommand = new RelayCommand(this.TurnBlue));
}
}
private void TurnBlue()
{
this.Color = Colors.Blue;
}
public ICommand GreenCommand
{
get
{
return this.greenCommand ?? (this.greenCommand = new RelayCommand(this.TurnGreen));
}
}
private void TurnGreen()
{
this.Color = Colors.Green;
}
private Color color = Colors.Red;
public Color Color
{
get
{
return this.color;
}
set
{
this.color = value;
RaisePropertyChanged("Color");
}
}
}
}
Есть ли способ из представления вызвать ColorAnimation вместо мгновенного перехода между значениями? То, как я сейчас это делаю, - это другое приложение, довольно беспорядочное, поскольку я устанавливаю ViewModel через свойство ViewModel
, а затем использую PropertyObserver для отслеживания изменений значений, затем создаю анимацию и запускаю ее из внутреннего кода:
this.colorObserver = new PropertyObserver<Player>(value)
.RegisterHandler(n => n.Color, this.CreateColorAnimation);
В ситуации, когда я имею дело со многими цветами и множеством потенциальных анимаций, это становится довольно беспорядочным и сводит на нет тот факт, что я вручную передаю ViewModel в View, чем просто привязываю их через ResourceDictionary. Полагаю, я мог бы сделать это и в событии DataContextChanged
, но есть ли способ лучше?