Podium是一种创新的演示控制工具,它由两部分组成:一部分是PowerPoint 2010的插件,另一部分是运行在Windows Phone 7设备上的应用程序。当用户开始演示时,插件会向手机发送推送通知,告知演示已准备就绪。一旦演示开始,插件会将每张幻灯片捕获为图片,并通过HTTP推送通知发送到手机上。如果手机上的应用正在运行,它将调用PowerPoint中的自托管WCF服务来获取幻灯片图片。用户可以通过在屏幕上轻触或滑动来发送消息,从而控制PowerPoint跳转到下一张或上一张幻灯片。
创建一个默认的PowerPoint 2010插件非常简单。VSTO 2010是Visual Studio 2010的一部分。首先,需要“检测”是否有新的演示文稿被打开。这可以通过监听PresentationOpen事件来实现。一旦收到这个事件,就会发送一个新的推送通知。接下来,需要监听SlideShowNextSlide和SlideShowBegin事件。对于这些事件,需要将新的幻灯片捕获为JPG图片。这些事件会传递一个SlideShowWindow的副本,可以使用它来将幻灯片复制到剪贴板。
window.View.Slide.Copy();
一旦幻灯片在剪贴板中,就可以很容易地将其保存到文件中。
var data = Clipboard.GetDataObject();
if (data == null)
return;
if (!data.GetDataPresent(DataFormats.Bitmap, true))
return;
Image image = (Image)data.GetData(DataFormats.Bitmap, true);
image.Save(CachePathFromGuid(guid), ImageFormat.Jpeg);
还需要为每张图片创建一个唯一的ID(使用GUID),并将其发送到设备上。
PowerPoint插件托管了一个非常基础的WCF服务。这个服务包括注册和注销操作,以及获取幻灯片、上一张幻灯片和下一张幻灯片的操作。为了使自托管WCF服务工作,应用程序需要以管理员身份运行。
[ServiceContract]
public interface IRegistrationService
{
[OperationContract, WebGet]
void Register(string uri);
[OperationContract, WebGet]
void Unregister(string uri);
[OperationContract, WebGet]
byte[] GetSlide(Guid guid);
[OperationContract, WebGet]
void PreviousSlide();
[OperationContract, WebGet]
void NextSlide();
}
注册/注销用于推送通知,而获取幻灯片、上一张幻灯片和下一张幻灯片则用于控制或与PowerPoint交互。
Windows Phone 7是微软开发的移动操作系统,是Windows Mobile平台的继任者。它的目标是通过重新设计用户界面、将操作系统与其他服务集成以及严格控制其运行的硬件,创造一个引人入胜的用户体验。Windows Phone 7使用Silverlight作为其编程模型,为WPF/Silverlight开发者提供了大量新的机会。在开始之前,需要下载Windows Phone开发者工具。安装完成后,可以创建一个新的Windows Phone应用程序。
这个应用程序的用户界面非常简单,只有一个屏幕等待新的幻灯片。如果新的幻灯片可用,就下载并显示它。这个应用程序只支持横向方向(这在特定场景中更有意义)。要将应用程序限制为仅支持特定方向,需要设置页面的SupportedOrientations和Orientation属性都为“Landscape”。
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Assets/Icons/LeftArrow.png" Text="Previous" x:Name="PreviousButton" Click="PreviousButton_Click" />
<shell:ApplicationBarIconButton IconUri="/Assets/Icons/RightArrow.png" Text="Next" x:Name="NextButton" Click="NextButton_Click" />
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
推送通知的工作原理如下:手机打开到云中通知服务的通道,一旦通道打开成功,手机就将通道URI发送到自托管的WCF服务。完成这些后,就可以开始了!现在PowerPoint可以使用这个提供的URI向手机发送消息。
notifier = new PushNotifier("PodiumChannel", "PodiumService");
notifier.Subscribed += new EventHandler(notifier_SubscribeToService);
notifier.HttpNotificationReceived += new EventHandler<Microsoft.Phone.Notification.HttpNotificationEventArgs>(notifier_HttpNotificationReceived);
notifier.Open();
在客户端(PowerPoint插件)中,有一个NotificationSenderUtility类负责发送推送和RAW HTTP通知!这里有一个推送消息的示例:
var subscribers = RegistrationService.GetSubscribers();
notifier.SendToastNotification(subscribers, "Podium", "这是一个推送消息", OnMessageSent);
手势识别在历史上一直很难实现!但现在不是这样了……使用了Silverlight for Windows Phone Toolkit提供的GestureService。
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Flick="GestureListener_Flick" DoubleTap="GestureListener_DoubleTap" Tap="GestureListener_Tap" />
</toolkit:GestureService.GestureListener>