Встраивание слайд-шоу XpsDocument PowerPoint в WPF DocumentViewer
Недавно я попробовал встроить файл PowerPoint как XpsDocument в WPF.
Это простое приложение WPF, в которое я встраиваю свойство DocumentViewer в свою сетку 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>
Чтобы создать документ, привязанный к "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:\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);
}
}
}
Все это работает достаточно хорошо при запуске программы, показывая документ Xps, встроенный в WPF:
Мой вопрос заключается в том, как я могу изменить код, чтобы отображать PowerPoint не просто как серию прокручиваемых слайдов, как показано, а в виде реального слайд-шоу? Я хотел бы сделать дополнительные обновления, чтобы позволить пользователю переходить к следующему слайду при каждом щелчке мыши - как "правильная" презентация. Моя проблема в том, что я незнаком с использованием XpsDocument Apis - я не знаю, является ли это случаем использования их для достижения того, что я хочу, или это в свойствах настройки переменной представления, которая преобразуется в формат Xps,
1 ответ
Мне удалось решить конкретную проблему, которая меня интересовала.
Пожалуйста, обратитесь к этой публикации блога для подробного объяснения:
Управление методами и свойствами DocumentViewer с помощью MVVM
Решение решает проблему возможности включения отдельных слайдов PowerPoint (преобразованных в формат файла xps), чтобы они занимали ВЕСЬ доступное пространство Windows, вызывая соответствующую комбинацию DocumentViewer
методы.
При нажатии экранной кнопки для вызова 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
сам экземпляр? Мне также нужно обновить MainWindow.xaml.cs, чтобы он возвращал экземпляр объекта DocumentViewer:
using System.Windows.Controls;
пространство имен DocumentView {открытый частичный класс MainWindow {частный статический DocumentViewer _docViewer;
public MainWindow()
{
InitializeComponent();
_docViewer = DocumentViewPowerPoint;
}
public static DocumentViewer GetInstance()
{
return _docViewer;
}
}}
куда DocumentViewPowerPoint
это имя, данное DocumentViewer в 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>