public MainViewModel()
{
////if (IsInDesignMode)
////{
//// // Code runs in Blend --> create design time data.
////}
////else
////{
//// // Code runs "for real"
////}
/* 쇼 동작 원리: 시작
* 1. 로딩.
* 2. MainViewModel.Play는 ActiveBoard.Start를 호출하고 이를 통해 첫 페이지 로딩 후 EVT_STARTING 전송. Starting으로 ShowPage Navigate.
* 3. ShowPage에서 이 메시지로 ActiveBoard의 CurrentPage를 로딩하고 그에 맞는 XAML 로딩.
* 4. 내부에 XAML이 EVT_LOADED 로딩.
* 5. 그에 대한 메시지로 현재 페이지에 대한 RemainedSecond를 셋팅.
* 6. tick마다 --RemainedSecond.
* 7. RemainedSecond < 0 이 되면 MoveNext..
*
* 총 메시지는 3번: ready, loaded, start.
*/
/* 쇼 동작원리: 종료
* 1. MainViewModel에서 타이머 종료, 첫페이지 돌리기, Finishing 명령 전송.
* 2. ShowPage 에서 이를 통해 Finished 및 Page Close.
* */
_timer = new DispatcherTimer();
_timer.Tick += PlayTimerEventHandler;
_timer.Interval = new TimeSpan(0, 0, 1);
Messenger.Default.Register<GenericMessage<LbMessage>>(this, message =>
{
Debug.WriteLine("* MainViewModel Received Message: " + message.Content.MessageType.ToString());
switch (message.Content.MessageType)
{
case LbMessageType.EVT_SHOW_FINISHING:
Stop(ActiveBoard);
break;
case LbMessageType.EVT_PAGE_STARTED:
// 페이지 장착 완료.
CurrentRemainedSecond = (int)CurrentPage.Duration.TotalSeconds;
CurrentPageStarted = true;
_timer.Start();
break;
case LbMessageType.EVT_SHOW_STARTED:
// 첫페이지 로딩.
ActiveBoard.Start();
CurrentPage = ActiveBoard.Board.Pages[ActiveBoard.CurrentIndex];
break;
case LbMessageType.EVT_PAGE_CREATING:
// 페이지 추가 명령을 받았을 때.
var page = generatePageFromTemaplate(message.Content.Data as LbTemplate);
ActiveBoard.Board.Pages.Add(page);
break;
case LbMessageType.EVT_PAGE_FINISHED:
CurrentRemainedSecond = 0;
CurrentPageElapsedRatio = 0;
break;
}
});
// 초기화하면서 TemplateList.xml 파일을 로딩한다.
Templates = new TemplateListViewModel();
}