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

时间:2013-03-31 03:04:36

标签: c# wpf winapi integration powerpoint

目前我在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集成的麻烦。

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:2)

使用/ s标志通过命令行启动演示文稿将播放幻灯片,而不启动闪屏。

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

我会尝试与您提到的某些WPF嵌入式解决方案一起使用或查看this approach

我对WPF知之甚少,所以希望有人可以提供更好的答案,包含所有这些内容。

答案 2 :(得分:1)

我真的不喜欢它,我不确定这适用于你的情况。你需要访问演示文稿,这是肯定的。 相当容易和轻量级。

我的基本想法是以某种方式将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)文件格式进行保存,请将 mht 替换为文件名末尾的htm ,并用 ppSaveAsWebArchive 替换ppSaveAsHTML。

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

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

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

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

enter image description here

答案 3 :(得分:1)

有一个名为DocumentViewer的WPF控件。

  1. 首先应将pptx转换为.xps文件格式。
  2. 然后将其绑定到DocumentViewer的Document属性。
  3. Here是将办公文档(包括pptx)转换为C sharp中的XPS的链接。

    XAML

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

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

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