2012-02-22 81 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。