title: Embedding XpsDocument PowerPoint slide shows into a WPF DocumentViewer
body: <p>I've recently had a go at embedding a PowerPoint file as an XpsDocument in WPF.</p>
  
  <p>It is a simple WPF application in which I embed a DocumentViewer property into my MainWindow.xaml grid:</p>
  
  <pre><code>&lt;Window x:Class="PowerPoint2.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:local="clr-namespace:PowerPoint2"
      mc:Ignorable="d"
      Title="MainWindow" Height="350" Width="525"&gt;
  
  &lt;Grid&gt;
      &lt;DocumentViewer
          Name="DocumentviewPowerPoint"
          VerticalAlignment="Top"
          HorizontalAlignment="Left" /&gt;
  &lt;/Grid&gt;
  </code></pre>
  
  <p></p>
  
  <p>To create the document bound to "DocumentviewPowerPoint" I convert the PowerPoint file that has been opened into Xps format and bind this variable to the XAML property mentioned earlier:</p>
  
  <pre><code>using System;
  using System.IO;
  using System.Windows;
  using System.Windows.Xps.Packaging;
  using Microsoft.Office.Core;
  using Microsoft.Office.Interop.PowerPoint;
  using Application = Microsoft.Office.Interop.PowerPoint.Application;
  
  namespace PowerPoint2
  {
      public partial class MainWindow : Window
      {
          public MainWindow()
          {
              InitializeComponent();
  
              const string powerPointFile = @"c:\temp\ppt.pptx";
              var xpsFile = Path.GetTempPath() + Guid.NewGuid() + ".pptx";
              var xpsDocument = ConvertPowerPointToXps(powerPointFile, xpsFile);
  
              DocumentviewPowerPoint.Document = xpsDocument.GetFixedDocumentSequence();            
          }
  
          private static XpsDocument ConvertPowerPointToXps(string pptFilename, string xpsFilename)
          {
              var pptApp = new Application();
  
              var presentation = pptApp.Presentations.Open(pptFilename, MsoTriState.msoTrue, MsoTriState.msoFalse,
              MsoTriState.msoFalse);
  
              try
              {           
                  presentation.ExportAsFixedFormat(xpsFilename, PpFixedFormatType.ppFixedFormatTypeXPS);
              }
              catch (Exception ex)
              {
                  MessageBox.Show("Failed to export to XPS format: " + ex);
              }
              finally
              {
                  presentation.Close();
                  pptApp.Quit();
              }
  
              return new XpsDocument(xpsFilename, FileAccess.Read);
          }
      }
  }
  </code></pre>
  
  <p>This all works well enough when running the program, showing the Xps document embedded into the WPF:</p>
  
  <p><a href="https://i.stack.imgur.com/gVnf4.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gVnf4.jpg" alt="enter image description here"></a></p>
  
  <p>My question is how can I further modify my code in order to display the PowerPoint not just as a series of scrollable slides as shown, but as an actual <em>slide show</em>?  I would like to make further updates to enable the user to navigate to the following slide on each mouse click - like a 'proper' presentation.  My problem is that I am unfamiliar with the usage of the XpsDocument Apis - I don't know if it's a case of using these to achieve what I want or is it in the settings properties of the presentation variable that gets converted to the Xps format.</p>