Запуск анимации из ViewModel в WPF / MVVM - PullRequest
9 голосов
/ 28 марта 2010

Я пишу приложение MVVM и начал вставлять несколько анимаций. Я хочу вызвать что-то на ViewModel, которая запускает раскадровку. В этом блоге был многообещающий подход , но на самом деле он не работает. Обработчик IDChanged никогда не запускается по какой-либо причине.

Я также обнаружил, что вы можете запускать анимацию на EventTriggers, но я не знаю, как вызвать ее на ViewModel.

Ответы [ 4 ]

10 голосов
/ 12 мая 2011

Я сделал это с помощью DataTrigger и связал его со свойством в моей ViewModel. Когда для свойства «FlashingBackGround» установлено значение «ON», запускается анимация раскадровки.

Также обязательно включите в свой проект ссылку на «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>

ViewModel:

 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 должен наследоваться от "INotifyPropertyChanged"

1 голос
/ 28 марта 2010

У меня есть свойство в моей виртуальной машине, которое отражает состояние приложения. Анимированные элементы в представлении имеют триггер данных, который запускает раскадровку, когда свойство VM имеет определенное значение.

0 голосов
/ 26 ноября 2013

Я столкнулся с той же проблемой, и ни один из этих постов действительно не помог, потому что анимации в коде, а некоторые из них были большими и сложными и требовали флуктуирующих переменных, поэтому им приходилось оставаться в коде. Я решил это, добавив свойства зависимостей в пользовательский элемент управления (представление), которые запускают анимацию, и связав их со свойствами в модели представления. Не знаю (/ волнует), нарушает ли это что-то или другое, потому что это работает очень хорошо! ура, степп

выдержка:

(просмотреть) Код контроля пользователя:

    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

View-модель:

public bool StartDialogAnimation
{
    get { return _startDialogAnimation; }
    set
    {
        if (_startDialogAnimation != value)
        {
            _startDialogAnimation = value;
            RaisePropertyChanged("StartDialogAnimation");
        }
    }
}
0 голосов
/ 04 апреля 2010

В итоге я добавил событие AnimationStarted в свою ViewModel с ключевой строкой для анимации. Затем в представлении я создаю анимацию программно, подписываюсь на событие AnimationStarted и запускаю соответствующую анимацию при ее запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...