Я пытался выяснить, как эффективно запускать анимацию в представлении, когда свойство в ViewModel обновляется, где анимация зависит от значения указанного свойства.
I Я воссоздал свою проблему в простом приложении с единственными View и ViewModel. Цель здесь - передать изменение цвета прямоугольника с помощью ColorAnimation. Для справки я использовал пакет MVVM Foundation Джоша Смита.
Пример проекта можно загрузить здесь.
Подводя итог, я хочу анимировать переход цвета в Просмотр при изменении свойства Color.
MainWindow.xaml
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");
}
}
}
}
Есть ли какой-либо способ из View запускать ColorAnimation вместо мгновенного перехода между значениями? То, как я сейчас это делаю, - это еще одно приложение, довольно беспорядочное, поскольку я устанавливаю ViewModel через свойство ViewModel
, а затем использую PropertyObserver для отслеживания изменений значений, затем создаю Animation и запускаю ее из программный код:
this.colorObserver = new PropertyObserver(value)
.RegisterHandler(n => n.Color, this.CreateColorAnimation);
В ситуации, когда я ' м, имея дело со многими цветами и многими потенциальными анимациями, это превращается в настоящий беспорядок и сводит на нет тот факт, что я вручную передаю ViewModel в View, чем просто привязываю их через ResourceDictionary. Полагаю, я мог бы сделать это и в событии DataContextChanged
, но есть ли способ лучше?