Wpf 动画完成时切换视图

Wpf 动画完成时切换视图,wpf,prism,prism-4,Wpf,Prism,Prism 4,我有一个以启动屏幕开始的Prism应用程序,然后需要更改为开始视图。下面是模块初始化方法的代码,我希望它能实现这一点: public void Initialize() { RegisterViewsAndServices(); //_manager.RegisterViewWithRegion(RegionNames.Content, typeof(ToolboxSplashView)); var vmSplash = _unityContainer.R

我有一个以启动屏幕开始的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);
  }
public void Initialize(){
RegisterViewsAndServices();
//_manager.RegisterViewWithRegion(RegionNames.Content,typeof(ToolboxSplashView));
var vmSplash=_unityContainer.Resolve();
IRegion region=_regionManager.Regions[RegionNames.Content];
region.Add(vmSplash.View);
var vmStart=_unityContainer.Resolve();
region.Deactivate(vmSplash.View);
region.Add(vmStart.View);
}
不幸的是,当我运行这个时,我只看到开始视图。如果我注释掉开始视图(代码的最后一段),我会看到开始屏幕和动画。如何检测动画已完成,然后从“飞溅”视图更改为“开始”视图


谢谢。

想一想,使用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);
public void Initialize()
{
RegisterViewsAndServices();
IEventAggregator ea=_unityContainer.Resolve();
ea.GetEvent().Subscribe(NavigateNext);
var vmSplash=_unityContainer.Resolve();
IRegion region=_regionManager.Regions[RegionNames.Content];
region.Add(vmSplash.View);
}
public void NavigateNext(对象someParam)
{
//导航码
var vmSplash=_unityContainer.Resolve();
var vmStart=_unityContainer.Resolve();
region.Deactivate(vmSplash.View);
region.Add(vmStart.View);
}
//共享代码部分(两个模块都可以访问)
公共类WhateverEvent:CompositePresentationEvent{}
//在启动屏幕中,您将使用以下代码行发布
ea.GetEvent().Publish(空);

启动视图和启动视图位于同一模块中。我在Splash视图的代码背后钩住了一个完整的事件处理程序(参见@michael的注释)。模块初始化现在仅启动启动视图

  public void Initialize() {

     RegisterViewsAndServices();

     var vmSplash = _unityContainer.Resolve<IToolboxSplashViewModel>();
     var region = _regionManager.Regions[RegionNames.Content];
     region.Add(vmSplash.View);
  }
ToolboxStartView位于同一模块中,因此不需要外部依赖项


Shell处理导航请求并切换视图。Prism.chm帮助文件是Prism下载的一部分,它在第8章中提供了一篇关于基于视图的导航的综述。一个不明显的问题是目标视图(在我的例子中是ToolboxStartView)必须是视图优先的配置,而不是视图模型优先的配置。

好的,我可以看到这一点。什么触发聚合事件?我是否在viewModel中捕获它,然后与模块通信以完成加载过程?或者我可以在这里全部完成吗?听起来它应该在您视图中的代码隐藏中,因为它与动画完成有关。您将从已完成事件中引发聚合事件。您的控制器类将订阅AggregateEvent,然后执行必要的代码。动画完成事件示例:关于完成的事件,您是正确的,该事件起作用,并将我带到代码隐藏中的事件处理程序。我研究并测试了您的总体活动想法,但未能使其发挥作用。已激发事件,但在激发事件时模块已关闭。由于这两个视图位于同一个模块中,所以我能够使导航正常工作。我已经在下面的答案中给出了解决方案。你是说你已经成功了,还是你仍然需要帮助?是的,您可以跳过聚合事件部分并将导航代码放在SplashScreen中,但现在您正在将SplashScreen连接到其他模块。aggregateevent只需在启动屏幕上宣布它已完成。正在侦听该聚合事件的代码的另一部分会看到公告并执行导航。是的,我将其用于导航,但不用于事件聚合。仍在学习如何做到这一点。谢谢你的推荐。我想我的问题是我订阅了模块上的事件,在shell视图模型中处理导航时。当时,我没有意识到控制器类的价值。我也关心耦合,但这两个视图在逻辑上是耦合的。当应用程序启动时,它们总是一个接一个地显示。谢谢你的帮助。
  <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);
  }