Внедрение слайд-шоу PowerPoint XpsDocument в WPF DocumentViewer

Недавно я попытался внедрить файл PowerPoint в качестве XpsDocument в WPF.

Это простое приложение WPF, в котором я встраиваю свойство DocumentViewer в мое главное окно.XAML сетка:

<Window x_Class="PowerPoint2.MainWindow"
    
    
    
    
    
    mc_Ignorable="d"
    Title="MainWindow" Height="350" Width="525">

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

Чтобы создать документ, привязанный к «DocumentviewPowerPoint» я преобразую файл PowerPoint, который был открыт в формат Xps и привязать эту переменную к свойству XAML, упомянутому ранее:

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:tempppt.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);
        }
    }
}

Это все работает достаточно хорошо при запуске программы, показывая документ Xps, встроенный в WPF:

Введите описание изображения здесь

Мой вопрос заключается в том, как я могу дополнительно изменить свой код для того, чтобы отобразить PowerPoint не только как серию прокручиваемых слайдов, как показано на рисунке, но и как фактическое слайд-шоу ? Я хотел бы сделать дальнейшие обновления, чтобы позволить пользователю перейти к следующему слайду при каждом щелчке мыши-как «правильная» презентация. Моя проблема заключается в том, что я не знаком с использованием API XpsDocument — я не знаю, является ли это случаем использования их для достижения того, что я хочу, или это в свойствах параметров переменной представления, которая преобразуется в формат Xps.

1 ответ

  1. Мне удалось решить интересующую меня проблему.

    Пожалуйста, обратитесь к этой публикации в блоге для получения подробного объяснения:

    Управление методами и свойствами DocumentViewer с помощью MVVM

    Решение решает проблему возможности разрешить отдельные слайды PowerPoint (преобразованные в формат файла xps), чтобы занять все доступное пространство windows, вызывая соответствующую комбинацию DocumentViewerметодов.

    При нажатии кнопки screen для вызова RelayCommand следующая комбинация вызовов API DocumentViewer в MainWindowViewModel.наблюдалась работа класса cs:

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

    И получить сам DocumentViewerэкземпляр? Мне также нужно обновить главное окно.код XAML.cs, чтобы получить его, чтобы вернуть экземпляр объекта DocumentViewer:

    using System.Windows.Controls;
    

    пространство имен DocumentView
    {
    открытый частичный класс MainWindow
    {
    частный статический DocumentViewer _docViewer;

      public MainWindow()
      {
         InitializeComponent();
         _docViewer = DocumentViewPowerPoint;
      }
    
      public static DocumentViewer GetInstance()
      {
         return _docViewer;
      }
    

    }
    }

    Где DocumentViewPowerPointимя, данное DocumentViewer в главном окне.код XAML:

    <Window x_Class="DocumentView.MainWindow"
        
        
        
        
        
        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>