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