从WPF / MVVM中的ViewModel启动动画

我正在编写一个MVVM应用程序并开始使用一些动画。 我想在启动故事板的ViewModel上调用一些东西。 这个博客有一个很有前途的方法 ,但实际上并没有用。 IDChanged处理程序由于某种原因永远不会触发。

我还发现你可以在EventTriggers上开始动画,但我不知道如何在ViewModel上引发动画。

我通过使用DataTrigger并将其绑定到我的ViewModel中的属性来完成此操作。 当“FlashingBackGround”属性设置为“ON”时,Storyboard动画将启动。

还要确保在项目中包含对“Microsoft.Expression.Interactions”的引用

XAML :(这直接在根节点中)

 ...      ...  

视图模型:

  private void TurnOnFlashingBackround() { FlashingBackground = "ON"; } private string _FlashingBackround = "OFF"; public string FlashingBackground { get { return _FlashingBackround; } private set { if (FlashingBackground == value) { return; } _FlashingBackround = value; this.OnPropertyChanged("FlashingBackground"); } } public new event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 

最后,Viewmodel必须inheritance自“INotifyPropertyChanged”

我的VM中有一个属性,它反映了应用程序的状态。 视图中的动画元素具有数据触发器,可在VM属性具有特定值时启动故事板。

我最终向我的ViewModel添加了一个AnimationStarted事件,其中包含一个关键字符串,表示它是什么动画。 然后在视图上我以编程方式创建动画,订阅AnimationStarted事件,并在它触发时关闭相应的动画。

我遇到了同样的问题,这些post都没有真正帮助,因为动画是在代码中,其中一些是大而复杂的,需要波动的变量,所以他们不得不留在代码中。 我通过在触发动画的用户控件(视图)中添加依赖项属性并将它们绑定到视图模型中的属性来解决它。 不知道(/关心)这是否违反了某些内容,因为它的效果非常好! 欢呼,斯特普

摘抄:

(查看)后面的用户控制代码:

  public override void OnApplyTemplate() { base.OnApplyTemplate(); SetAnimationBindings(); } private void SetAnimationBindings() { _dialogStartPosition = mbFolderBrowse.Margin; var propName = "StartDialogAnimation"; var binding = new Binding(propName) { Mode = BindingMode.TwoWay }; this.SetBinding(DialogAnimationProperty, binding); propName = "StartProgressAnimation"; binding = new Binding(propName) { Mode = BindingMode.TwoWay }; this.SetBinding(ProgressAnimationProperty, binding); } #region Animation Properties #region DialogAnimation public static readonly DependencyProperty DialogAnimationProperty = DependencyProperty.Register("DialogAnimation", typeof(bool), typeof(Manage), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnDialogAnimationChanged)); public bool DialogAnimation { get { return (bool)this.GetValue(DialogAnimationProperty); } set { var oldValue = (bool)this.GetValue(DialogAnimationProperty); if (oldValue != value) this.SetValue(DialogAnimationProperty, value); } } private static void OnDialogAnimationChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { Manage m = o as Manage; if ((bool)e.NewValue == true) m.SlideInDialogPanel(); // animations else m.SlideOutDialogPanel(); } #endregion 

视图模型:

 public bool StartDialogAnimation { get { return _startDialogAnimation; } set { if (_startDialogAnimation != value) { _startDialogAnimation = value; RaisePropertyChanged("StartDialogAnimation"); } } }