9

目前我有一个 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

4 回答 4

11

You could convert your presentation to a video format on-the-fly:

// 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;
}

And then you would play it with MediaElement:

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

public void PlayPresentation(string filename)
{
    var wmvfile = GetVideoFromPpt(filename);
    player.Source = new Uri(wmvfile);
    player.Play();
}

Don't forget to File.Delete(wmvfile) when you're done playing the video!

于 2013-04-03T22:14:36.737 回答
3

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

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

我会尝试与您提到的一些 WPF 嵌入解决方案相结合,或者看看这种方法

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

于 2013-04-02T21:25:08.513 回答
1

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

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

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

  • 在 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 中它只是一个文件,所以更适合我。我很确定如果您需要通用解决方案,也可以在代码中自动执行此步骤。

To display the html file in a webbrowser control is the easy part, I uploaded it to my dropbox for convenience and just set the source (I'll leave it up there for a few days if you want to have a look at it directly).

As for starting the slideshow immediately, I'll have to look into it some more.

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

在此处输入图像描述

于 2013-04-02T21:33:55.093 回答
1

There is a WPF control called DocumentViewer.

  1. First the pptx should be converted to .xps file format.
  2. Then Bind it to the Document property of the DocumentViewer.

Here is the link to convert office documents (including pptx) to XPS in C sharp.

XAML

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

</DocumentViewer>

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

 myDocumentViewer.Document = this.ConvertPptxDocToXPSDoc(this.FileName, this.newXPSDocumentName).GetFixedDocumentSequence();
于 2013-04-04T04:12:38.953 回答