2012-02-22 93 views
0

我有一個Prism應用程序,它以一個啓動畫面開始,然後需要切換到一個開始視圖。下面是我希望這將完成這一模塊的初始化方法的代碼:動畫完成時切換視圖

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來宣告動畫已完成,並讓控件類在收到該聚合事件通知時執行代碼的第二部分。

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

好的,我可以看到那種。什麼觸發了聚合事件?我是否在視圖模型中捕獲它,然後傳回模塊以完成加載過程?或者我可以在這裏做到這一切嗎? – JimBoone 2012-02-22 22:25:20

+0

聽起來好像它應該在視圖中的代碼隱藏中,因爲它與動畫完成有關。您將在Completed事件中引發一個Aggregate Event。您是Controller類已訂閱了AggregateEvent,然後執行必要的代碼。動畫完成事件示例:http://social.msdn.microsoft.com/Forums/ar/wpf/thread/0b040d2e-155b-4abd-911d-ea7f72784fd0 – michael 2012-02-23 14:42:43

+0

您對完成的事件是正確的,該事件工作並帶我到代碼後面的事件處理程序。我研究和測試了你的聚合事件想法,但無法讓他們工作。事件被解僱,但事件發生時該模塊已經關閉。我能夠使導航工作,因爲這兩個視圖在同一個模塊中。我已將解決方案放在下面的答案中。 – JimBoone 2012-02-24 15:10:25

0

Splash和Start視圖位於同一個模塊中。我在Splash視圖的代碼隱藏中鉤了一個Completed事件處理程序(請參閱@michael的評論)。模塊初始化現在只啓動Splash視圖。

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是在同一模塊中,因此沒有外部的依賴是需要。

Shell處理導航請求並切換視圖。 Prism下載的Prism.chm幫助文件提供了第8章有關基於視圖的導航的文章。一個不明顯的問題是目標視圖(在我的情況下爲ToolboxStartView)必須是View-first配置,首先不是ViewModel。