2012-02-21 8 views
0

を完了するためにストーリーボードを待ちガード句を持つことができます。あなたは、私がボタンを押したときに5秒間に実行ストーリーボードを定義したい

  • 私はストーリーボード上のガード句を置くことができますボタンを何度も押すのを止めるには?

  • でない場合、ViewModelで明示的にアニメーションを参照しなくても、これを処理する方法があります。

答えて

1

実際にボタンをアニメーションにリンクする必要がある場合は、おそらくTriggerAction(System.Windows.Interactivity.TriggerAction)を作成してボタンにアタッチします。アクションはボタンを無効にし、アニメーションを開始し、アニメーションの完了イベントを待機してからボタンを再び有効にします。

すべてのインタラクションがビューに関連しているため、IMHO MVVMは適切ではありません.ViewModelにアニメーションがアニメーション化されていることを通知する実際の方法はありません。さらに、実際のアニメーション時間は確定的ではないため、一定の時間を前提としている場合は、他の意味合いを持つ可能性があります。

アニメーションのHandOffBehaviorを設定することもできます。実際に行っているアニメーションに応じて、ユーザーがボタンを繰り返しハンマーした場合、実際のペナルティは発生しません。存在する場合は、上記の提案を使用し、ボタンを無効にします。

+0

それは私が自分自身を考え終えることです。アニメーションは厳密にはビューに関連しているので、ViewModelにプロパティを追加する必要はまったくありません。上記のコメントで言われたように、データは既に存在します。厳密にはプレゼンテーション。 – deanvmc

1

は、次の操作を行うことができます:

ボタンをクリックする
  • 、あなたのStoryboardを開始し、falseにあなたButton.IsEnabledを設定します。これにより、その後のクリックが防止されます。
  • ハンドルStoryboard.Completedボタンを再度有効にするためのイベント。

MVVMの観点からは、ボタンの有効な状態はビューモデルのプロパティである必要があります。これをブール値のプロパティとして公開し、Button.IsEnabledにバインドする必要があります。ストーリーボード(おそらくコードビハインドから)を起動すると、ビューモデルへの参照を介してボタンを有効にした状態を設定できます。

はい、...コードビハインドで!これはあなたのビューモデルからあなたのビューを十分に分離し、単体テストを可能にします。

+0

これは良いアイデアです。私の唯一の関心事は、ビューのViewModelへの参照を通常は取っておらず、本当に1つのプロパティに対してそれをしたくないということです。私は最初に他の人々のオプションを見たいと思います。 – deanvmc

+0

@deanvmc十分に公正。しかし、ビュー・モデルは複数のビューを持つことがありますが、ビューは通常、単一のビュー・モデル・タイプのみをレンダリングすることに注意してください。したがって、ビューのコードビハインド内で具体的なビューモデルタイプを参照することはめったに問題を引き起こさない。 – ColinE

+0

これは非常に真実ですが、Viewを制御するためだけにViewのViewModelプロパティにアクセスする必要がある場合(データはそこにあり、ストーリーボードはプロパティに時間がかかることをシミュレートします) ViewModelにViewを上から外した場合、プロパティは決して考慮されません。私はストーリーボードにその考え方を実行させる目的で、ボタンを隠すための表示のみの制限なので、コードの背後にあるプロセス全体(ストーリーボード+ガード節)を直接制御する必要があるのだろうか? – deanvmc

関連する問題