2012-02-22 4 views
0

시작 화면으로 시작하는 프리즘 응용 프로그램이 있고 시작보기로 변경해야합니다. 여기에 내가이를 달성하기를 희망 모듈의 초기화 방법에 대한 코드는 다음과 같습니다 불행하게도애니메이션 완료시보기 전환

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

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); 
+0

좋아, 나는 그 sortof 볼 수 있습니다. 집계 이벤트를 트리거하는 것은 무엇입니까? 내가보기에 그것을 잡을 수 있습니까? 그러면 모듈이로드 프로세스를 완료하기 위해 다시 모듈로 통신합니까? 아니면 여기 모두 할 수 있을까요? – JimBoone

+0

애니메이션 완성과 관련되어 있기 때문에보기에서 코드 숨김에 있어야하는 것처럼 들립니다. Completed 이벤트에서 집계 이벤트를 발생시킵니다. 컨트롤러 클래스는 AggregateEvent에 가입 한 다음 필요한 코드를 실행합니다. 완료된 애니메이션의 예 완료된 이벤트 : http://social.msdn.microsoft.com/Forums/ar/wpf/thread/0b040d2e-155b-4abd-911d-ea7f72784fd0 – michael

+0

Completed 이벤트에 대해 정확합니다. 코드에서 이벤트 핸들러. 내가 수집 한 이벤트 아이디어를 조사하고 테스트했지만 작동시키지 못했습니다. 이벤트가 시작되었지만 모듈이 이미 닫혔습니다. 두 개의보기가 동일한 모듈에 있었기 때문에 탐색 기능을 사용할 수있었습니다. 아래의 답에 해결책을 넣었습니다. – JimBoone

0

스플래시보기와 시작보기가 동일한 모듈에 있습니다. Splash 뷰의 코드 숨김에서 Completed 이벤트 핸들러 (@michael의 주석 참조)를 연결했습니다. 이제 모듈 초기화는 시작보기 만 시작합니다.

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 동일한 모듈로되어 있으므로 외부 의존성이없는을 필수.

셸은 탐색 요청을 처리하고보기를 전환합니다. Prism 다운로드의 일부인 Prism.chm 도움말 파일은 8 장에서보기 기반 탐색에 대한 글을 제공합니다. 한 가지 명백한 문제는 대상보기 (필자의 경우 ToolboxStartView)가 먼저보기 먼저 구성이어야한다는 것입니다. ViewModel-first는 아니다.