2012-02-22 12 views
0

私はスプラッシュ画面で始まり、開始ビューに変更する必要があるプリズムアプリケーションを持っています。ここで私はこれを達成することを望んだモジュールの初期化メソッドのコードは次のとおりです。アニメーションが完了したときにビューを切り替える

残念ながら
public void Initialize() { 

    RegisterViewsAndServices(); 

    //_manager.RegisterViewWithRegion(RegionNames.Content, typeof(ToolboxSplashView)); 

    var vmSplash = _unityContainer.Resolve<IToolboxSplashViewModel>(); 
    IRegion region = _regionManager.Regions[RegionNames.Content]; 
    region.Add(vmSplash.View); 

    var vmStart = _unityContainer.Resolve<IToolboxStartViewModel>(); 
    region.Deactivate(vmSplash.View); 
    region.Add(vmStart.View); 
    } 

、私はこれを実行すると、私は唯一のスタートビューを参照してください。開始ビュー(コードの最後の段落)をコメントアウトすると、開始画面とアニメーションが表示されます。アニメーションが完了したことを検出して、スプラッシュビューから開始ビューに変更するにはどうすればよいですか?

ありがとうございました。

答えて

2

AggregateEventを使用して、アニメーションが完了したことを通知し、その集約イベント通知を受け取ったときにコントロールクラスがコードの第2部分を実行するようにします。

public void Initialize() 
{ 
    RegisterViewsAndServices(); 

    IEventAggregator ea = _unityContainer.Resolve<IEventAggregator>(); 
    ea.GetEvent<WhateverEvent>().Subscribe(NavigateNext); 

    var vmSplash = _unityContainer.Resolve<IToolboxSplashViewModel>(); 
    IRegion region = _regionManager.Regions[RegionNames.Content]; 
    region.Add(vmSplash.View); 
} 

public void NavigateNext(object someParam) 
{ 
    //Navigation Code 
    var vmSplash = _unityContainer.Resolve<IToolboxSplashViewModel>(); 
    var vmStart = _unityContainer.Resolve<IToolboxStartViewModel>(); 
    region.Deactivate(vmSplash.View); 
    region.Add(vmStart.View); 
} 

//Shared code section (that both modules have access to) 
public class WhateverEvent : CompositePresentationEvent<object> { } 

//In your splash screen you will use the following line of code to publish 
ea.GetEvent<WhateverEvent>().Publish(null); 
+0

OK、私はそのsortofを見ることができます。集計イベントをトリガするのは何ですか?私は私のviewModelでそれをキャッチして、ロードプロセスを終了するためにモジュールに返信しますか?または、私はここでそれをすべてやってもいい? – JimBoone

+0

アニメーションの完成に関連しているので、ビューのコードビハインドにあるように思えます。完了イベント内から集計イベントを発生させます。コントローラクラスはAggregateEventを購読し、必要なコードを実行します。完了したアニメーションの例イベント:http://social.msdn.microsoft.com/Forums/ar/wpf/thread/0b040d2e-155b-4abd-911d-ea7f72784fd0 – michael

+0

完了したイベントについては正解です。イベントハンドラはコードの背後にあります。私はあなたの集計イベントのアイデアを研究し、テストしましたが、それを働かせることはできませんでした。イベントは発生しましたが、イベントが発生するとモジュールは既に閉じられていました。 2つのビューが同じモジュールにあったので、ナビゲーションを動作させることができました。私は以下の答えに答えを入れました。 – JimBoone

0

スプラッシュビューと開始ビューは同じモジュールにあります。 SplashビューのコードビハインドでCompletedイベントハンドラ(@michaelによるコメント参照)をフックしました。モジュールの初期化では、スプラッシュ表示が開始されるようになりました。

public void Initialize() { 

    RegisterViewsAndServices(); 

    var vmSplash = _unityContainer.Resolve<IToolboxSplashViewModel>(); 
    var region = _regionManager.Regions[RegionNames.Content]; 
    region.Add(vmSplash.View); 
    } 

ストーリーボードXAMLが完了イベントを示す:コードビハインド

<EventTrigger RoutedEvent="Image.Loaded"> 
    <BeginStoryboard> 
     <Storyboard Completed="StoryboardSplashCompleted"> 
      <DoubleAnimation 
       Storyboard.TargetName="slamDunkImage" 
       Storyboard.TargetProperty="Opacity" 
       From="0.0" To="1.0" 
       Duration="0:0:2" 
       AutoReverse="True" /> 
     </Storyboard> 
    </BeginStoryboard> 
    </EventTrigger> 

を、イベントハンドラ:

private void StoryboardSplashCompleted(object s, EventArgs args) { 
    _regionManager.RequestNavigate(RegionNames.Content, typeof(ToolboxStartView).FullName); 
    } 

ToolboxStartViewは同じモジュールであるので、外部の依存関係はありません必須。

シェルはナビゲーション要求を処理し、ビューを切り替えます。 Prismのダウンロードの一部であるPrism.chmヘルプファイルには、第8章のViewベースのナビゲーションについての記事があります。わかりにくい問題の1つは、ターゲットビュー(私の場合はToolboxStartView)がビューファーストの構成でなければならず、 ViewModel-firstではありません。

関連する問題