Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过ControlStoryboardAction从ViewModel启动情节提要不会';行不通_C#_Wpf_Mvvm_Event Triggers - Fatal编程技术网

C# 通过ControlStoryboardAction从ViewModel启动情节提要不会';行不通

C# 通过ControlStoryboardAction从ViewModel启动情节提要不会';行不通,c#,wpf,mvvm,event-triggers,C#,Wpf,Mvvm,Event Triggers,我正在尝试从我的viewmodel启动故事板动画。这个想法是,我的应用程序在以后每次从服务器接收到位置更新时都会有一个动画,但是现在最好有一个概念证明,我可以通过按下按钮更新位置并启动动画 我的第一个方法是使用Microsoft.Expression.Interactivity ControlStoryboardAction(请随时告诉我是否有更好的方法实现我的目标)。我正在将触发器绑定到CanAnimate属性,默认情况下该属性设置为true,因此动画应该在加载后立即启动,但事实并非如此。 当

我正在尝试从我的viewmodel启动故事板动画。这个想法是,我的应用程序在以后每次从服务器接收到位置更新时都会有一个动画,但是现在最好有一个概念证明,我可以通过按下按钮更新位置并启动动画

我的第一个方法是使用Microsoft.Expression.Interactivity ControlStoryboardAction(请随时告诉我是否有更好的方法实现我的目标)。我正在将触发器绑定到CanAnimate属性,默认情况下该属性设置为true,因此动画应该在加载后立即启动,但事实并非如此。 当我使用Eventtrigger时,故事板可以工作,但这不是我想要的:

<Window x:Class="AnimationExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:AnimationExample"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>

    <Canvas Name="CanvasWrapper" Width="525" Height="350">
        <Ellipse Fill="Red" Width="60" Height="60" Canvas.Left="60" Canvas.Top="60">
            <Ellipse.Resources>
                <Storyboard x:Key="Movement">
                    <DoubleAnimation
                                Storyboard.TargetProperty="(Canvas.Left)"
                                Duration="0:0:0.1" To="{Binding NextPosX}" />
                    <DoubleAnimation
                                Storyboard.TargetProperty="(Canvas.Top)"
                                Duration="0:0:0.1" To="{Binding NextPosY}" />
                </Storyboard>
            </Ellipse.Resources>
            <!-- This trigger is just for testing and works fine! -->
            <Ellipse.Triggers>
                <EventTrigger RoutedEvent="Ellipse.MouseEnter">
                    <EventTrigger.Actions>
                        <BeginStoryboard  Storyboard="{StaticResource Movement}"/>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Ellipse.Triggers>
            <!-- This trigger doesn't works -->
            <i:Interaction.Triggers>
                <ei:DataTrigger Binding="{Binding CanAnimate}" Value="True" Comparison="Equal">
                    <ei:ControlStoryboardAction Storyboard="{StaticResource Movement}" ControlStoryboardOption="Play" />
                </ei:DataTrigger>
            </i:Interaction.Triggers>
        </Ellipse>
    </Canvas>
</Window>
提前谢谢

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace AnimationExample
{
    class MainWindowViewModel : INotifyPropertyChanged
    {

        int _nextPosX = 120;

        public int NextPosX
        {
            get { return _nextPosX; }
            set
            {
                if (value != _nextPosX)
                {
                    _nextPosX = value;
                    OnPropertyChanged("NextPosX");
                }
            }
        }

        int _nextPosY = 120;

        public int NextPosY
        {
            get { return _nextPosY; }
            set
            {
                if (value != _nextPosY)
                {
                    _nextPosY = value;
                    OnPropertyChanged("NextPosY");
                }
            }
        }

        bool _canAnimate = true;

        public bool CanAnimate
        {
            get { return _canAnimate; }
            set
            {
                if (value != _canAnimate)
                {
                    _canAnimate = value;
                    OnPropertyChanged("CanAnimate");
                }
            }
        }

        ICommand _calculate;
        public ICommand CalculateNextPos
        {
            get
            {
                if(_calculate == null)
                {
                    _calculate = new ActionCommand(dummy =>
                    {
                        NextPosX = 500;
                        NextPosY = 500;
                    }, dummy => true);
                }
                return _calculate;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

}