动画完成后切换视图

时间:2012-02-22 21:43:18

标签: wpf prism prism-4

我有一个以Splash屏幕开头的Prism应用程序,然后需要更改为“开始”视图。以下是我希望实现此目的的模块的Initialize方法的代码:

  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 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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-first。