2016-12-27 2 views
0

J'ai récemment essayé d'incorporer un fichier PowerPoint en tant que XpsDocument dans WPF.Incorporation de diapositives XpsDocument PowerPoint dans un DocumentViewer WPF

Il est une simple application WPF dans laquelle j'intégrer une propriété DocumentViewer dans ma grille MainWindow.xaml:

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

<Grid> 
    <DocumentViewer 
     Name="DocumentviewPowerPoint" 
     VerticalAlignment="Top" 
     HorizontalAlignment="Left" /> 
</Grid> 

Pour créer le document lié à "DocumentviewPowerPoint" je convertir le fichier PowerPoint a été ouvert au format XPS et lier cette variable à la propriété XAML mentionnée plus haut:

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

Tout cela fonctionne assez bien lors de l'exécution du p rogramme, montrant le document Xps intégré dans le WPF:

enter image description here

Ma question est de savoir comment puis-je modifier encore mon code pour afficher le PowerPoint non seulement comme une série de diapositives défilants comme indiqué, mais comme réelle diaporama? Je voudrais faire d'autres mises à jour pour permettre à l'utilisateur de naviguer vers la diapositive suivante à chaque clic de souris - comme une présentation «appropriée». Mon problème est que je ne suis pas familier avec l'utilisation de l'Apis XpsDocument - Je ne sais pas s'il s'agit de les utiliser pour obtenir ce que je veux ou est-ce dans les propriétés de paramètres de la variable de présentation convertie au format Xps .

Répondre

0

j'ai réussi à résoudre le problème particulier, je me suis intéressé à

S'il vous plaît se référer à cette publication de blog pour une explication détaillée.

Controlling DocumentViewer methods and properties using MVVM

La solution aborde le problème de pouvoir activer diapositives PowerPoint individuelles (converties au format de fichier xps) pour occuper la totalité de l'espace Windows disponible en invoquant la combinaison pertinente de DocumentViewer méthodes.

En appuyant sur le bouton de l'écran pour appeler la RelayCommand, la combinaison suivante d'appels API DocumentViewer dans la classe MainWindowViewModel.cs a été observée au travail:

public ICommand Command 
    { 
    get 
    { 
     return _command ?? (_command = new RelayCommand(
      x => 
      { 
       DocumentViewer = MainWindow.GetInstance(); 

       const string powerPointFile = @"c:\temp\ppt.pptx"; 
       var xpsFile = Path.GetTempPath() + Guid.NewGuid() + ".xps"; 
       var xpsDocument = ConvertPowerPointToXps(powerPointFile, xpsFile); 

       FixedFixedDocumentSequence = xpsDocument.GetFixedDocumentSequence(); 
       DocumentViewer.Document = FixedFixedDocumentSequence; 

       DocumentViewer.GoToPage(1); 
       DocumentViewer.FitToMaxPagesAcross(1); 
       WindowState = WindowState.Maximized; 
       DocumentViewer.FitToMaxPagesAcross(1); 
      })); 
    } 
    } 

Et pour obtenir l'instance DocumentViewer lui-même? Je dois aussi mettre à jour les MainWindow.xaml.cs pour l'obtenir pour retourner l'instance de l'objet DocumentViewer:

using System.Windows.Controls; 

espace de noms DocumentView { public partial class MainWindow {private static DocumentViewer _docViewer;

public MainWindow() 
    { 
    InitializeComponent(); 
    _docViewer = DocumentViewPowerPoint; 
    } 

    public static DocumentViewer GetInstance() 
    { 
    return _docViewer; 
    } 

}}

DocumentViewPowerPoint est le nom donné au DocumentViewer dans le MainWindow.xaml:

<Window x:Class="DocumentView.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:DocumentView" 
    mc:Ignorable="d" 
    WindowState="{Binding WindowState, Mode=TwoWay}" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.DataContext> 
    <local:MainWindowViewModel /> 
</Window.DataContext> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="50" /> 
    </Grid.RowDefinitions> 

    <DocumentViewer 
     Grid.Row="0" 
     Document="{Binding FixedFixedDocumentSequence}" 
     Name="DocumentViewPowerPoint" 
     VerticalAlignment="Top" 
     HorizontalAlignment="Left" /> 

    <Button 
     Grid.Row="1" 
     Command="{Binding Command}" 
     Width="70" Height="30" Content="Press" /> 
</Grid>