如何在不打开另一个窗口的情况下将 PowerPoint 演示文稿嵌入到 WPF 应用程序中?

Posted

技术标签:

【中文标题】如何在不打开另一个窗口的情况下将 PowerPoint 演示文稿嵌入到 WPF 应用程序中?【英文标题】:How can I embed a PowerPoint presentation into a WPF application without opening another window? 【发布时间】:2013-03-21 11:48:59 【问题描述】:

目前我有一个 C# 中的 WPF 应用程序,但我发现很难找到任何有用的方法将 PowerPoint 演示文稿嵌入到我的窗口中。

我在这里找到了一个解决方案:Embedding a Powerpoint show into a C# application

此解决方案产生了使 PowerPoint 在另一个窗口中运行的问题,但只是在 WPF 应用程序中显示其 UI。这意味着当 WPF 窗口聚焦时,PowerPoint 演示文稿没有聚焦,并停止播放。还有关闭窗口时 PowerPoint 崩溃的问题。

我在这里找到了另一个解决方案:http://www.codeproject.com/Articles/118676/Embedding-PowerPoint-presentation-player-into-a-WP

该解决方案很受欢迎,但我发现它很难使用。我不知道任何 Win32 编程或 C++,所以我发现它很难修改。我设法让它停止显示 PowerPoint 的第二个副本(原始项目中的预期功能),但我还没有找到自动打开 PowerPoint 演示文稿的方法。

所以我需要一种在后台自动干净地打开 PowerPoint 演示文稿的方法(我不希望 PowerPoint UI 在任何时候显示),并允许它自动运行(而不是响应输入),而应用程序正在运行。如果我能将它保留在 C# 和 WPF 中,而不必处理 Win32 和 C++,那就太好了。

这可能吗?在这一点上,我真的很后悔这个项目,仅仅是因为 PowerPoint 集成问题。

【问题讨论】:

另一种方法是将您的演示文稿转换为另一种格式,例如可以使用 WPF MediaPlayer 播放的视频。这可能会有所帮助:***.com/questions/13311579 这是个好主意。我会调查的。 @Joulukuusi 您的解决方案是最适合我们的解决方案。请创建一个答案,以便我可以给你赏金。 完成,但是,我没有 Office 2010,因此无法测试解决方案。如果它不适合你,我想你可以回答你自己的问题。 【参考方案1】:

通过带有 /s 标志的命令行启动演示文稿将播放幻灯片而不启动启动屏幕。

powerpnt.exe /s c:\path\to\your\presentation.pptx

我会尝试与您提到的一些 WPF 嵌入解决方案配合使用,或者查看 this approach。

我对 WPF 知之甚少,所以希望有人能提供一个包含所有这些部分的更好的答案。

【讨论】:

【参考方案2】:

我不太喜欢它,我不确定这是否适用于您的情况。您需要访问演示文稿,这是肯定的。然而,它相当简单和轻便。

我的基本想法是以某种方式将 powerpoint 演示文稿嵌入到 html 中,然后使用 webbrowser 控件来显示它。似乎有一个number of ways 可以做到这一点。

我决定尝试将演示文稿直接保存为 html,结果证明这是可能的(至少对于 PP2010),尽管布局可能会更好。另一种方法(例如谷歌文档)可能会产生更好的东西。我从这个link 中获取了以下内容。

在 PowerPoint 2010 中,打开要导出到的演示文稿 HTML 按 Alt+F11。 按 Ctrl+G。

在“立即”窗格中,键入以下内容,然后按 Enter: ActivePresentation.SaveAs "<Drive>:\users\<username>\desktop\<filename>.htm", ppSaveAsHTML, msoFalse

注意要使用单文件网页 (*.mht; *.mhtml) 文件格式保存,请将文件名末尾的 htm 替换为 mht ,并将 ppSaveAsHTML 替换为 ppSaveAsWebArchive

如果你将它导出到 htm 中,你会得到很多额外的文件,在 mht 中它只是一个文件,所以更适合我。如果您需要通用解决方案,我很确定也可以在代码中自动执行此步骤。

要在 webbrowser 控件中显示 html 文件是很容易的部分,为了方便起见,我将它上传到了我的 Dropbox 并设置了源(如果你想看一下,我会把它放在那里几天直接)。

至于立即开始幻灯片放映,我得再研究一下。

<WebBrowser x:Name="webbrowser" Source="https://dl.dropbox.com/u/27614341/test.mht"/>

【讨论】:

在 WebBrowser 中显示 PowerPoint 演示文稿时,如何访问幻灯片数量等信息? 哦,没关系。我现在意识到 Slide 1 of 3 部分是在转换为 html 期间添加的。【参考方案3】:

您可以即时将演示文稿转换为视频格式:

// not tested as I don't have the Office 2010, but should work
private string GetVideoFromPpt(string filename)

    var app = new PowerPoint.Application();
    var presentation = app.Presentations.Open(filename, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);

    var wmvfile = Guid.NewGuid().ToString() + ".wmv";
    var fullpath = Path.GetTempPath() + filename;

    try
    
        presentation.CreateVideo(wmvfile);
        presentation.SaveCopyAs(fullpath, PowerPoint.PpSaveAsFileType.ppSaveAsWMV, MsoTriState.msoCTrue);
    
    catch (COMException ex)
    
        wmvfile = null;
    
    finally
    
        app.Quit();
    

    return wmvfile;

然后你会和MediaElement一起玩:

<MediaElement Name="player" LoadedBehavior="Manual" UnloadedBehavior="Stop" />

public void PlayPresentation(string filename)

    var wmvfile = GetVideoFromPpt(filename);
    player.Source = new Uri(wmvfile);
    player.Play();

播放完视频后别忘了File.Delete(wmvfile)

【讨论】:

只要您的演示文稿不需要用户交互,这是一个相当不错的解决方案。 SaveCopyAs 需要很长时间,任何方法都可以在视频文件准备好后获取信号,因为我想在视频准备好后播放该视频。【参考方案4】:

有一个名为 DocumentViewer 的 WPF 控件。

    首先应将 pptx 转换为 .xps 文件格式。 然后将其绑定到 DocumentViewer 的 Document 属性。

Here 是将办公文档(包括pptx)转换为CSharp 中的XPS 的链接。

XAML

<DocumentViewer Name="myDocumentViewer" Margin="0,0,0,59">

</DocumentViewer>

绑定到控件的Document属性(注意ConvertPptxDocToXPSDoc是pptx转xps的方法)

 myDocumentViewer.Document = this.ConvertPptxDocToXPSDoc(this.FileName, this.newXPSDocumentName).GetFixedDocumentSequence();

【讨论】:

如果演示文稿有声音,这将不起作用,否则这是个好主意。 你看过以下帖子吗? post1post2

以上是关于如何在不打开另一个窗口的情况下将 PowerPoint 演示文稿嵌入到 WPF 应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不打开另一个应用程序的情况下将数据从一个应用程序传递到另一个应用程序?

如何在不使用循环的情况下将json分配给另一个[重复]

如何在不丢失鼠标抓取的情况下将 QGraphicsItem 移动到另一个场景?

如何在不破坏 UI 的情况下将搜索放在另一个线程中?

如何在不使用全局存储的情况下将类对象从一个屏幕传递到另一个屏幕

如何在不选择新实例的情况下将一个查询的结果加入另一个查询的结果? [复制]