This was posted on Dec. 29 and updated on Dec. 30. The significant changes are to the Configuration and Marker Events sections
This blog post extends the previous post in which I discussed the IMarkerEventHandler interface and how it might be implemented.
Readers and Frames
The design calls for one or more Pages each of which may have any number of UI modules. The default case is to have a TableOfContents module, a LinksDisplay module and a Reader module.
A Reader houses Frames where a Frame is a set of controls. The Reader knows which frame to create and manages the lifetime of Frames.
A given frame has a known set of controls. For example, Frame-Type-1 might house the HVP-extended version of the Silverlight Media Framework player (as described in this blog post) and Frame-Type-2 might display an html page and have a set of navigation controls. (More on readers and Frames early in January)
The meaning and actions to be taken by a Frame in response to hitting a marker in the video will be managed by the IMarkerEventHandler (MEH) implementing class. as described in the previous post mentioned earlier.
One approach is to have the Marker Event Handler class own a collection of HVPMarkerEvent business objects, each representing one association between a marker, its time, its type (link, etc.) and whatever other information the MEH class will need to raise the appropriate event. A second approach, and one that is gaining a lot of traction, is to bring in the EventAggregator from Prism.
Supporting Legacy Videos
The Silverlight HyperVideo Player will continue to support existing videos that do not have markers nor our config files by having a default layout in which there is a reader that takes up the entire page, and that reader contains a Frame that itself contains nothing but our extension to the SMF player.
We are actively looking at when using an IoC (Inversion of Control) container such as Ninject would provide services that are not otherwise available. For now, we believe MEF will provide the Container services, configuration and interaction with Unit Test that we need.