如何在WPF中将整个ScrollViewer打印到PDF文件

我有一个功能,可以将布局打印到PDF文件(使用PDFSharp库)。

我的问题是我的Grid包括一个ScrollViewer

问题在于ScrollViewer在PDF文件中显然不可滚动。

我有办法改变吗?

microsoft.Win32.SaveFileDialog dlg = new microsoft.Win32.SaveFileDialog();
dlg.FileName = "NHF Tool";
dlg.DefaultExt = ".pdf";
dlg.Filter = "PDF (.pdf)|*.pdf";

Nullable<bool> result = dlg.ShowDialog();

try
{
    if (result == true)
    {
        MemoryStream lMemoryStream = new MemoryStream();
        Package package = Package.Open(lMemoryStream,FileMode.Create);
        XpsDocument doc = new XpsDocument(package);
        XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
        writer.Write(MainCanvas);
        doc.Close();
        package.Close();
        var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(lMemoryStream);
        PdfSharp.Xps.XpsConverter.Convert(pdfXpsDoc,dlg.FileName,0);
    }
}
catch (System.IO.IOException)
{
    MessageBox.Show("TEMP");
}
<Window x:Class="NHF_Tool.MainWindow" 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:my="clr-namespace:NHF_Tool"
  Title="Test" Height="800" Width="1525">

    <Grid Background="Gainsboro">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <GroupBox Grid.Row="0" Header="Test1" Margin="10">
            <Grid>
                <Button Content="Sample content" Margin="20"/>
            </Grid>
        </GroupBox>

        <GroupBox Grid.Row="1" Header="Test2" Margin="10">
            <ScrollViewer x:Name="ScrollViewer">
                <StackPanel Orientation="Vertical">
                    <Rectangle Fill="LightYellow" Height="300" Margin="20"/>
                    <TextBox HorizontalAlignment="Center" Grid.Row="1" Text="TextBox"/>
                </StackPanel>
            </ScrollViewer>
        </GroupBox>
    </Grid>
</Window>
LoongWalker 回答:如何在WPF中将整个ScrollViewer打印到PDF文件

您可以临时增加MainWindow.Height(或Width,具体取决于您的ScrollViewer方向)以适应整个ScrollViewer的内容,等待新的布局/渲染过程然后将其打印为PDF。

MainWindow window = this;
double oldHeight = window.Height; // saving regular Height for rollback
window.Height = 5000; // large enough temporary increase

window.SynchronouslyRedraw();

PrintToPdf(); // the method you already have
window.Height = oldHeight; // undo temporary increase

我喜欢将此扩展方法用于同步重绘操作:

public static class UIElementExtensions {
    /// <summary>
    /// Synchronously redraws this <see cref="UIElement"/>. Only works if in a <see cref="Window"/> visual tree.
    /// </summary>
    public static void SynchronouslyRedraw(this UIElement uiElement) {
        uiElement.InvalidateVisual();
        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle,new Action(() => { })).Wait();
        Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render,new Action(() => { })).Wait();
    }
}
本文链接:https://www.f2er.com/3110012.html

大家都在问