Переключить вид после завершения анимации - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть приложение 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);
  }

К сожалению, когда я запускаю это, я вижу только вид Start.Если я закомментирую начальный вид (последний абзац кода), я вижу начальный экран и анимацию.Как определить, что анимация завершена, а затем переключиться из режима «Всплеск» в режим «Пуск»?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Просто подумайте, используйте 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 голосов
/ 24 февраля 2012

Виды Splash и Start находятся в одном модуле.Я подключил обработчик событий Completed (см. Комментарий @michael) в коде позади представления Splash.Инициализация модуля теперь только запускает представление Splash.

  public void Initialize() {

     RegisterViewsAndServices();

     var vmSplash = _unityContainer.Resolve<IToolboxSplashViewModel>();
     var region = _regionManager.Regions[RegionNames.Content];
     region.Add(vmSplash.View);
  }

Раскадровка Xaml, показывающая событие Completed:

  <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.chm, который является частью загрузки Prism, содержит описание навигации на основе View в главе 8. Одна неочевидная проблема заключается в том, что целевое представление (в моем случае ToolboxStartView) должно быть конфигурацией View-first,не ViewModel-first.

...