0

私は実際にMVVMパターンに準拠しようとしていますが、その結果、ビューモデルのプロパティが設定されるたびに(バインディングを介して)ビューでアニメーションを起動する方法を理解するのが困難です。

MainWindow.xaml には ContentPresenter があり、そのプレゼンターのコンテンツを、ユーザーに表示される現在のビューのビュー モデルにバインドしています。たとえば、ユーザーが最初にアプリケーションを実行すると、ContentPresenter は StartViewModel にバインドされます。次に、ユーザーが別の画面に移動するボタンをクリックしてスタディを実行する場合、たとえば、ContentPresenter を StudyViewModel にバインドして、StudyView 画面を表示できるようにする必要があります。次に、ユーザーが開始画面に戻りたい場合、その時点の ContentPresenter は、アプリケーションの起動時に作成された StartViewModel に再度バインドされます。次のようになります。

<Window
...
  <Grid
  ...
        <ContentControl
            x:Name="CurrentContentView"
            Width="Auto"
            Grid.Row="2" 
            Content="{Binding CurrentContentViewModel}" />
  </Grid>
</Window>

CurrentContentViewModel のタイプは「ViewModelBase」です。これは、INotifyPropertyChanged を実装するすべてのビュー モデル用に作成した基本クラスです。舞台裏で ViewModelBase の ObservableCollection を保持し、ユーザーを新しい画面に移動させるイベントが発生するたびに、そのコレクションで適切なビュー モデルを探し、そのビュー モデルに CurrentContentViewModel を設定します。コレクションにまだ存在しない場合は、最初にコレクションに追加してから、CurrentContentViewModel をそのビュー モデルに設定します。

私の質問は、ビューが表示されるたびにビューに「イントロ」アニメーションを実行させるにはどうすればよいですか? ビューが ContentPresenter 内に単に読み込まれるたびにストーリーボードを実行するように設定することはできません。これは、ユーザーがアプリケーションの有効期間中に既に読み込まれたビューに戻ったときにアニメーションを再度実行したいからです。その上、私のビューは「ダム」であり、MainWindow の ContentPresenter がビューではなくビュー モデルにバインドされているため、MainWindow に再び表示されていることを認識していません (そのため、VIEW MODEL がコンテンツ プレゼンターにバインドされるたびに何らかのイベントを発生させる必要があり、ビューはそのイベントに応答する必要があります)。

誰かが持っているかもしれないアイデアを事前に感謝し、この質問がすでに尋ねられている場合は申し訳ありません. 似たような投稿をいくつか見つけましたが、私がやりたいこととまったく同じものはありません。

更新 - 解決策が見つかりました

結局のところ (少なくとも私が現在持っている実装では)、これは私が思っていたよりもはるかに簡単に解決できる問題でした。データ テンプレート パターンを使用してビューを構築している場合 (つまり、リソース ディクショナリでビュー モデルごとにデータ テンプレートを定義し、そのリソース ディクショナリを app.xaml ファイルのリソース リストに追加する)、毎回ビューが再作成されます。コンテンツ コントロールから削除されます。私の場合、コンテンツ コントロールのコンテンツを以前のものとは異なるビュー モデルにバインドするたびに、そのビュー モデル用に「構築」されたビューが実際に破棄されます。次に、ビュー モデルが再びコンテンツ コントロールに再割り当てされると、ビューが最初から作成されます。したがって、画面のイントロ アニメーションをビューの Loaded イベントに入れることができます。

他の誰かが同様の問題に直面している場合に備えて、これを共有したかったのですが、データ テンプレートを使用してビュー モデルのビューを表示するこの種の動作を知りませんでした。

4

1 に答える 1

1

それはむしろ、あなたが求めているアニメーションに依存します。たとえば、現在のビューをスライド アウトしてから次のビューをスライド インする場合は、制御ビュー モデルで と の 2 つのイベントを発生させるだけCurrentContentViewModelChangingですCurrentContentViewModelChanged。ビューは、これらのイベントに基づいて適切なアニメーションをトリガーできます。

ただし、アニメーションで古いビューと同時に新しいビューを表示する必要がある場合は、少し複雑になります。新しいビューと同時に古いビューを公開するか、新しいビューが代用される直前に古いビューのスナップショットを取得するビューが必要です。繰り返しますが、同じイベントを使用してこれを達成します。

于 2011-11-04T18:17:43.343 に答える