如何在 WPF 应用程序中生成 FlowDocument 的“打印预览”?

2024-01-09

我的各种 WPF 应用程序显示 FlowDocument。我可以使用中描述的方法打印它们的答案打印 WPF FlowDocument https://stackoverflow.com/questions/345009/printing-a-wpf-flowdocument/853461#853461.

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

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

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

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

建议?

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

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

Thanks


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

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 按钮:打印、调整到最大页宽等。

我还添加了一些代码来隐藏搜索框。看这个答案WPF:如何删除 DocumentViewer 中的搜索框? https://stackoverflow.com/questions/2322727/wpf-how-can-i-remove-the-searchbox-in-a-documentviewer/2323275#2323275我是如何做到的。

效果是这样的:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WPF 应用程序中生成 FlowDocument 的“打印预览”? 的相关文章

  • 使用 Youtube .net API 上传视频并将其设置为不公开

    net 的 Youtube API 似乎有一段时间没有更新了 因此 没有公开的属性或方法可以将视频设置为不列出 如果有人以前遇到过这个问题 可以建议解决方法吗 我也很难弄清楚这一点 所以我想我会将我的发现发布给任何寻求此问题答案的人 As
  • 使用内部构造函数实例化类

    我有一个类 其构造函数被定义为内部 这意味着我无法实例化它 虽然这可能有道理 但出于调试和研究目的 我仍然愿意做一次 是否可以通过反射来做到这一点 我知道我可以访问私有 内部成员 但是我可以调用内部构造函数吗 或者 由于构造函数没有做任何重
  • 如何使用 C# 打印 pdf

    我在 C 应用程序中使用 进程 打印 pdf 文件 但是我无法获取打印状态 我发现可以通过 System management 和 System printing 与打印机 队列进行交互 我做了很多尝试 但都出错了使用这两个命名空间但无法打
  • 可选参数“必须是编译时常量”

    我有一个类分为两个部分文件 如下所示 public partial class PersonRepository BaseRepository
  • .NET 程序集大小会影响性能吗?

    net 程序集的大小是否会影响性能 您的 Windows 窗体 Web 窗体项目中的程序集数量如何 来自微软的模式和实践提高 NET 应用程序性能和可扩展性 http msdn microsoft com en us library ms9
  • .NET 的 HttpWebResponse 是否会自动解压缩 GZiped 和 Deflated 响应?

    我正在尝试执行一个接受压缩响应的请求 var request HttpWebRequest HttpWebRequest Create requestUri request Headers Add HttpRequestHeader Acc
  • 如何通过反射访问Generic.List的索引?

    好的 我有一个类 我将一个对象作为属性传递 我传递的对象是List
  • .net core 中的 CPU 使用情况(至少在 Windows 上)

    So PerformanceCounter在 dotnet core 中消失了 我理解这是因为它不兼容 Linux 这条评论在这里 NET Core 性能计数器的故事是什么 https stackoverflow com questions
  • .NET Regex Negative Lookahead - 我做错了什么?

    假设我有 StartTest NoInclude EndTest StartTest Include EndTest 并正在使用 StartTest NoInclude s S EndTest g 为什么我要匹配这两个组 正则表达式示例 h
  • 在 .NET 中使用 NTFS 压缩来压缩文件夹

    我想在 NET 中使用 NTFS 压缩来压缩文件夹 我发现这个帖子 http bytes com groups net c 262874 making folder compressed 但它不起作用 它抛出异常 无效参数 Director
  • WPF (MVVM) 菜单中的互斥(且可绑定)复选框

    我试图找到一个在 WPF MVVM 应用程序的菜单中使用复选框的示例 该应用程序可以绑定到底层 ViewModel 类中的枚举 我有一个简单的例子 public class MyViewModel public MyViewModel co
  • 连接到 SQL Server 数据库 C#-WinForms

    我正在制作一个桌面应用程序 我希望用户必须登录才能充分使用该程序 我已经在 www winhost com 我的网站的托管位置 上创建了一个数据库 但现在我不知道该怎么办 我一直在使用 google 和 msdn 我想知道如何以编程方式将新
  • 如何延长SQL查询的超时时间

    这不是连接超时 因为与数据库的连接正常 问题是我调用的存储过程花费的时间超过 30 秒 并导致超时 该函数的代码如下所示 SqlDatabase db new SqlDatabase connectionManager SqlConnect
  • 将 X509 证书存储在数据库中

    为了访问网络服务 我需要一个证书 我生成了我的证书 openssl genrsa 1024 gt private key openssl req new x509 nodes sha1 days 1100 key private key g
  • 如何引用 dotNet Core 项目?

    我想将 dotNet Core 项目引用到 WPF 项目 我的 WPF 项目使用 v4 6 2 dotNet Framework 我的 dotNet Core 项目使用 v1 6 dotNet Standard 当我尝试引用它时 出现此错误
  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • 外部组件中的控制器上的 404

    我在解决 Asp Net MVC 4 项目中的 404 响应时遇到问题 它是在 VS2012 中构建的 目标版本为 4 5 我已将预编译的视图和控制器内置到独立的 DLL 中 我能够动态加载 DLL 并从我的核心项目中检查它们 甚至调用它们
  • 如何确定我的 TextBlock 文本是否正在被修剪?

    以下文本块按预期换行和修剪 修剪文本时会显示省略号
  • 如何使WPF TreeView风格成为WinForms TreeView?

    WPF 默认的 TreeView 非常好 我仍然希望它有连接每个子元素的线 就像 Windows 窗体 TreeView 一样 我在网上搜索了一些例子 但设计得不够好 我怎样才能用WPF实现它 让我回答我自己的问题 Code 您需要做的只是
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read

随机推荐