gpt4 book ai didi

.net - 如何在 WPF 应用程序中生成 "print preview"的 FlowDocument?

转载 作者:行者123 更新时间:2023-12-02 04:05:09 25 4
gpt4 key购买 nike

我的各种WPF应用程序显示FlowDocument。我可以使用 the answer to Printing a WPF FlowDocument 中描述的方法打印它们。 。

现在我想添加“打印预览”功能。在正常情况下,我正在打印窗口中显示的 FlowDocument,因此我不需要打印预览。但在某些情况下,要打印的 FlowDocument 是在内存中动态构建的。在这些情况下,我想在打印之前显示它。

现在,我当然可以弹出一个新窗口并显示 FlowDocument,但是

  1. 我希望预览确实感觉就像是打印操作的一部分,而不仅仅是应用程序中的另一个窗口。

  2. 我不想在 FlowDocumentScrollViewer 中使用普通的 FlowDocument。它需要受到纸张尺寸、特定高宽比和分页的限制,而不是“任何尺寸”。

建议?

  • 我应该只使用标准窗口吗?在这种情况下,如何确保 FlowDocument 处于正确的比例?

  • 是否有一种更“集成”的方法可以在属于 Windows 的 PrintDialog UI 范围内进行预览?

谢谢

最佳答案

根据添加到我的问题的评论中的提示,我这样做了:

private string _previewWindowXaml =
@"<Window
xmlns ='http://schemas.microsoft.com/netfx/2007/xaml/presentation'
xmlns:x ='http://schemas.microsoft.com/winfx/2006/xaml'
Title ='Print Preview - @@TITLE'
Height ='200'
Width ='300'
WindowStartupLocation ='CenterOwner'>
<DocumentViewer Name='dv1'/>
</Window>";

internal void DoPreview(string title)
{
string fileName = System.IO.Path.GetRandomFileName();
FlowDocumentScrollViewer visual = (FlowDocumentScrollViewer)(_parent.FindName("fdsv1"));
try
{
// write the XPS document
using (XpsDocument doc = new XpsDocument(fileName, FileAccess.ReadWrite))
{
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
writer.Write(visual);
}

// Read the XPS document into a dynamically generated
// preview Window
using (XpsDocument doc = new XpsDocument(fileName, FileAccess.Read))
{
FixedDocumentSequence fds = doc.GetFixedDocumentSequence();

string s = _previewWindowXaml;
s = s.Replace("@@TITLE", title.Replace("'", "&apos;"));

using (var reader = new System.Xml.XmlTextReader(new StringReader(s)))
{
Window preview = System.Windows.Markup.XamlReader.Load(reader) as Window;

DocumentViewer dv1 = LogicalTreeHelper.FindLogicalNode(preview, "dv1") as DocumentViewer;
dv1.Document = fds as IDocumentPaginatorSource;


preview.ShowDialog();
}
}
}
finally
{
if (File.Exists(fileName))
{
try
{
File.Delete(fileName);
}
catch
{
}
}
}
}

它的作用:它实际上将视觉内容打印到 XPS 文档中。然后,它加载“打印的”XPS 文档,并将其显示在一个非常简单的 XAML 文件中,该文件存储为字符串,而不是作为单独的模块,并在运行时动态加载。生成的窗口具有 DocumentViewer 按钮:打印、调整到最大页宽等。

我还添加了一些代码来隐藏搜索框。请参阅this answer to WPF: How can I remove the searchbox in a DocumentViewer?了解我是如何做到的。

效果是这样的:

alt text

XpsDocument 可以在 ReachFramework dll 中找到,XpsDocumentWriter 可以在 System.Printing dll 中找到,两者都必须添加为项目的引用

关于.net - 如何在 WPF 应用程序中生成 "print preview"的 FlowDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2322064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com