我有一个以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);
}
不幸的是,当我运行它时,我只看到了“开始”视图。如果我注释掉“开始”视图(代码的最后一段),我会看到开始屏幕和动画。如何检测动画已完成,然后从“启动”视图更改为“开始”视图?
感谢。
答案 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。