0

我有一个以启动画面开头的 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);
  }

不幸的是,当我运行它时,我只看到开始视图。如果我注释掉开始视图(代码的最后一段),我会看到开始屏幕和动画。如何检测到动画已完成,然后从 Splash 视图更改为 Start 视图?

谢谢。

4

2 回答 2

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);
于 2012-02-22T21:48:05.823 回答
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);
  }

显示 Completed 事件的情节提要 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)必须是视图优先配置,不是 ViewModel-first。

于 2012-02-24T15:32:12.377 回答