wpf - 在 WPF 中使用数据绑定(bind)启动动画

标签 wpf data-binding animation mvvm

我正在尝试调整一个简单的 WPF 应用程序以使用 Model-View-ViewModel 模式。在我的页面上,我有几个动画:

<Page.Resources>
    <Storyboard x:Name="storyboardRight"
                x:Key="storyboardRight">
        <DoubleAnimation x:Name="da3"
                         Storyboard.TargetName="labelRight"
                         Storyboard.TargetProperty="Opacity"
                         From="0"
                         To="1"
                         Duration="0:0:0.5" />
        <DoubleAnimation x:Name="da4"
                         Storyboard.TargetName="labelRight"
                         Storyboard.TargetProperty="Opacity"
                         From="1"
                         To="0"
                         BeginTime="0:0:1"
                         Duration="0:0:0.5" />
    </Storyboard>
    ...
</Page.Resources>

目前我在后面的代码中开始动画,并且可以在完成时监听 Co​​mpleted 事件以执行以下代码:
storyboardRight = (Storyboard)TryFindResource("storyboardRight");
storyboardRight.Completed += new EventHandler(storyboardRight_Completed);
storyboardRight.Begin(this);

有没有办法将 Storyboard数据绑定(bind)到我的 ViewModel,以便它从 ViewModel 引发的事件开始,并在完成时回调到该 ViewModel?

最佳答案

我通过使用 DataTrigger 并将其绑定(bind)到我的 ViewModel 中的属性来做到这一点。当“FlashingBackGround”属性设置为“ON”时, Storyboard 动画开始。

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

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

<Window
   xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
   xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
   x:Name="window" >
    ...

    <i:Interaction.Triggers>
      <ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON">
        <ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"     
                                                ControlStoryboardOption="Play"/>
      </ei:DataTrigger>
    </i:Interaction.Triggers>

    ...
</Window>

View 模型:
    private void TurnOnFlashingBackround()
    {
        this.FlashingBackground = "ON";
    }

    private string _FlashingBackround = "OFF";

    public string FlashingBackground
    {
        get { return this._FlashingBackround; }

        private set
        {
            if (this.FlashingBackground == value)
            {
                return;
            }

            this._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 必须继承自“INotifyPropertyChanged”

关于wpf - 在 WPF 中使用数据绑定(bind)启动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/286904/

相关文章:

.net - 用于 wpf mvvm 的 MVVM 工具包(模板)和 XAML powertoys 工作吗?

c# - 在datagrid中添加context menu,如何获取select Item的值

c# - ListView + 多选 + MVVM =?

jQuery:减少重绘

c# - Prism WPF 动态区域

javascript - polymer 绑定(bind)数据到使用 innerHTML 加载的元素

asp.net - 可以在 ASP.NET 数据绑定(bind)表达式中使用 LINQ 扩展方法运算符吗?

javascript - 为什么数据绑定(bind)并不总是适用于原语?

javascript - 具有平滑更新动画的 d3 线图

jquery - 为什么当我调用slideDown时,这一行是 'jump'?