8

Model-View-ViewModel パターンを使用するように単純な WPF アプリケーションを適応させようとしています。私のページには、いくつかのアニメーションがあります。

<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にコールバックできるようにする方法はありますか?

4

3 に答える 3

9

Microsoft の Josh Twist にこの質問をする機会がありました。Josh Twist は親切にもこの問題に対する回答を提供してくれました。DataTrigger解決策は、ViewModel で列挙型と組み合わせてを使用して、ストーリーボードを起動することです。これには、ページをContentPresenter. ICommandアニメーションの完了を処理するには、ViewModel で を呼び出すために少量のコード ビハインドが必要でした。

ソリューションの完全な説明については、こちらの Josh の投稿をお読みください。

于 2008-12-31T11:12:55.323 に答える
2

これは、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));
        }
    }

最後に、ビューモデルは「INotifyPropertyChanged」から継承する必要があります

于 2011-05-12T15:54:42.230 に答える
1

を使用する必要がありますEventTrigger。WPF のアニメーションに関するこの記事が役立つ場合があります。MSDNの「ルーティング イベントの概要」および「方法: イベント トリガーを使用して、開始後にストーリーボードを制御する」も参照してください。

于 2008-11-13T13:48:56.703 に答える