65.9K
CodeProject 正在变化。 阅读更多。
Home

Podium

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (18投票s)

2010年9月30日

CPOL

4分钟阅读

viewsIcon

57803

Podium 是一个 PowerPoint 插件和 Windows Phone 7 应用,用于从 Windows Phone 7 设备控制 PowerPoint。

引言

在本篇文章中,Rudi Grobler 创建了一个 Windows Phone 7 的配套工具,用于控制 PowerPoint 演示文稿。

什么是 Podium

Podium 实际上由两部分组成……第一部分是 PowerPoint 2010 插件,它会监控 PowerPoint 的幻灯片放映。一旦幻灯片放映开始,它会向 Windows Phone 7 设备发送一个推送通知(Toast 消息),“宣布”幻灯片放映已准备就绪!当幻灯片放映实际开始时(按 F5),该插件会捕获每一张幻灯片(JPG 格式)并向设备发送另一个推送通知(RAW http),包含该幻灯片的 ID!如果手机应用程序正在运行,一旦收到此通知,它将通过自托管的 WCF 服务回调到 PowerPoint,并获取幻灯片图像。通过点击或滑动屏幕,用户可以向 PowerPoint 发送消息以切换到下一张或上一张幻灯片!

PowerPoint 2010 VSTO

我刚刚创建了一个默认的 PowerPoint 2010 插件

CreateANewAddin.png - Click to enlarge image

注意: VSTO 2010 是 Visual Studio 2010 的一部分。

我需要“检测”是否打开了新的演示文稿。这很容易通过监听 PresentationOpen 事件来实现。一旦收到,我就会发送一个新的 Toast 通知(稍后会介绍)。接下来是幻灯片放映开始或切换到下一张幻灯片……我监听的事件是 SlideShowNextSlide & SlideShowBegin。对于每个事件,我都需要将新幻灯片捕获为 JPG。这些事件在其 EventArgs 中传递了一个 SlideShowWindow 的副本……而 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(使用 Guids)并将其发送到设备。

自托管 WCF 服务

PowerPoint 插件托管了一个非常基本的 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();
}

注意:要使自托管的 WCF 服务正常工作,应用程序需要以管理员身份运行。

Register/Unregister 用于推送通知,而 GetSlidePreviousSlide NextSlide 用于控制或与 PowerPoint 交互。

Windows Phone 7

注意:在本文中,我假设您对 Silverlight 有基本了解。

Windows Phone 7 是由 微软 开发的 移动操作系统,是其 Windows Mobile 平台的后续产品。[2] 该系统定于 2010 年 10 月 21 日在欧洲推出,11 月 8 日在美国推出。[3] 微软的目标是通过重新设计用户界面、将操作系统与其他服务集成以及严格控制硬件来创建引人注目的用户体验。[4] 微软于 2010 年 2 月 15 日在巴塞罗那举行的 世界移动通信大会 上正式发布了 Windows Phone 7[5],并在 2010 年 3 月 15 日的 MIX 大会上公布了更多细节。Windows Phone 7 于 2010 年 9 月 1 日发布到制造环节[6],最终 SDK 于 9 月 16 日发布。[7]

Windows Phone 7 使用 Silverlight 作为其编程模型,这为 WPF/Silverlight 开发人员带来了大量新机遇。开始之前,请先下载 Windows Phone Developer Tools。安装完成后,我们就可以创建一个新的 Windows Phone 应用程序了。

CreateANewPhoneApp.png - Click to enlarge image

此应用程序的用户界面非常简单……只有一个屏幕,等待新的幻灯片。

WaitForPresenter.PNG - Click to enlarge image

如果有新幻灯片,则下载并显示

SlideAvailable.PNG - Click to enlarge image

此应用程序仅支持横向模式(这对我而言更合理)。要将应用程序限制为仅特定方向,请将页面上的 SupportedOrientations Orientation 均设置为“Landscape”。

为了方便导航,我还添加了一些按钮到 ApplicationBar

“应用程序栏显示为手机屏幕底部的一行,包含一到四个图标按钮。这些图标按钮用于为用户提供对应用程序最常用任务的快速访问。”

<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>

这是它的样子

podium/AppBarButtons.png

推送通知

podium/PushNotification.PNG

推送通知的工作原理如下

手机打开一个到云端通知服务的通道(1)。一旦通道成功打开(2),手机就会将通道 URI 发送给自托管的 WCF 服务(3)。完成这些后,我们就准备好了!现在 PowerPoint 可以使用提供的 URI(4 + 2)发送消息到手机。

所有这些都封装在一个 PushNotifier 类中(在手机上)。您需要做的就是创建一个 PushNotifier 的新实例。

notifier = new PushNotifier("PodiumChannel", "PodiumService");
notifier.Subscribed += new EventHandler(notifier_SubscribeToService);
notifier.HttpNotificationReceived += 
	new EventHandler<Microsoft.Phone.Notification.HttpNotificationEventArgs>
		(notifier_HttpNotificationReceived);
notifier.Open();

创建 PushNotifier 后,处理 Subscribe & HttpNotificationReceived 事件!一切设置完成后,调用 Open()

在客户端(PowerPoint 插件)上,有一个 NotificationSenderUtility 类负责发送 Toast 和 RAW http 通知!这是一个 Toast 消息的示例

var subscribers = RegistrationService.GetSubscribers();
notifier.SendToastNotification(subscribers, "Podium", 
			"This is a toast", OnMessageSent);

手势

手势识别历来都很困难!现在不再是了……我使用了 GestureService (由 Silverlight for Windows Phone Toolkit 提供)。

<toolkit:GestureService.GestureListener>
    <toolkit:GestureListener 
        Flick="GestureListener_Flick" 
        DoubleTap="GestureListener_DoubleTap" 
        Tap="GestureListener_Tap" />
</toolkit:GestureService.GestureListener>

结论

技能可以从桌面/WPF 迁移到 Web/Silverlight,再到手机/Silverlight,这是微软生态系统的一大优势!一夜之间,成千上万的 WPF 和 Silverlight 开发人员立即变成了移动开发人员!请给我看任何其他平台能做到这一点?

如果您想了解更多关于 Windows Phone 7 的信息,请查看我的 博客……我经常会写关于 WP7、Silverlight 和 WPF 的文章!

© . All rights reserved.