从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"); } } }
- UWP直接从Windows应用程序打印而不带打印对话框
- SharePoint:如何以编程方式将项添加到自定义列表实例
- 使用LibTiff.Net 2.3库时,如何让StripOffsets标记保持不变?
- ASP.NET MVC“调用不明确”错误(System.IO.TextWriter.Write)
- 使用Visual Studio 2013的Crystal Report aspnet_client / system_web / 4_6_81
- SQL数据错误:将varchar数据类型转换为日期时间数据类型会导致超出范围的值
- 如何将图像存储到varbinary(max)列?
- 在C#中更改标签的背景颜色
- 我可以将char或DateTime设置为null吗?