Использование привязки данных для запуска анимации в WPF - PullRequest
8 голосов
/ 13 ноября 2008

Я пытаюсь адаптировать простое приложение 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>

В настоящее время я начинаю анимацию в коде позади и могу прослушать событие Completed, чтобы сделать что-нибудь, когда оно завершится со следующим кодом:

storyboardRight = (Storyboard)TryFindResource("storyboardRight");
storyboardRight.Completed += new EventHandler(storyboardRight_Completed);
storyboardRight.Begin(this);

Есть ли способ привязки данных раскадровки к моей ViewModel, чтобы он начинался с события, вызванного ViewModel, и мог обратный вызов в эту ViewModel после его завершения?

Ответы [ 3 ]

9 голосов
/ 31 декабря 2008

У меня была возможность задать этот вопрос Джошу Твисту из Microsoft, который любезно нашел время, чтобы дать ответ на эту проблему. Решение состоит в том, чтобы использовать DataTrigger в сочетании с перечислением в ViewModel для запуска раскадровки, а это, в свою очередь, требует помещения страницы в ContentPresenter. Чтобы обработать завершение анимации, потребовалось небольшое количество кода для вызова ICommand в ViewModel.

Прочитайте пост Джоша здесь для полного описания решения.

2 голосов
/ 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()
    {
        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"

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