另存为 XPS 文档的 FlowDocument 中缺少图像

2023-11-21

当 FlowDocument 保存为 XPS 文档时,获取 FlowDocument 中包含的图像以显示时遇到一些困难。

这是我所做的:

  1. 使用创建图像ImageWPF 的控制。我通过对 BeginInit/EndInit 的调用将图像源设置为括起来。
  2. 将图像添加到 FlowDocument 中,将其包装在块UI容器.
  3. 使用修改版本将 FlowDocument 对象保存到 XPS 文件这段代码.

如果我随后在 XPS 查看器中查看保存的文件,则不会显示图像。问题是图像在 WPF 实际显示在屏幕上之前不会加载,因此它们不会保存到 XPS 文件中。因此,有一个解决方法:如果我首先使用流程文档页面查看器然后保存XPS文件,图像被加载并显示在XPS文件中。即使 FlowDocumentPageViewer 处于隐藏状态,此操作也有效。但这给了我另一个挑战。这是我想做的(伪代码):

void SaveDocument()
{
    AddFlowDocumentToFlowDocumentPageViewer();
    SaveFlowDocumentToXpsFile();
}

这当然不起作用,因为在将文档保存到 XPS 文件之前,FlowDocumentPageViewer 永远没有机会显示其内容。我尝试将 SaveFlowDocumentToXpsFile 包装在对 Dispatcher.BeginInvoke 的调用中,但没有帮助。

我的问题是:

  1. 我是否可以在保存 XPS 文件之前强制加载图像,而不在屏幕上实际显示文档? (我尝试摆弄位图图像.CreateOptions没有运气)。
  2. 如果问题#1 没有解决方案,有没有办法告诉 FlowDocumentPageViewer 何时完成加载其内容,以便我知道何时保存以创建 XPS 文件?

最终的解决方案与您遇到的相同,即将文档放入查看器中并在屏幕上短暂显示。下面是我为我编写的辅助方法。

private static string ForceRenderFlowDocumentXaml = 
@"<Window xmlns=""http://schemas.microsoft.com/netfx/2007/xaml/presentation""
          xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
       <FlowDocumentScrollViewer Name=""viewer""/>
  </Window>";

public static void ForceRenderFlowDocument(FlowDocument document)
{
    using (var reader = new XmlTextReader(new StringReader(ForceRenderFlowDocumentXaml)))
    {
        Window window = XamlReader.Load(reader) as Window;
        FlowDocumentScrollViewer viewer = LogicalTreeHelper.FindLogicalNode(window, "viewer") as FlowDocumentScrollViewer;
        viewer.Document = document;
        // Show the window way off-screen
        window.WindowStartupLocation = WindowStartupLocation.Manual;
        window.Top = Int32.MaxValue;
        window.Left = Int32.MaxValue;
        window.ShowInTaskbar = false;
        window.Show();
        // Ensure that dispatcher has done the layout and render passes
        Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Loaded, new Action(() => {}));
        viewer.Document = null;
        window.Close();
    }
}

Edit:我刚刚添加了window.ShowInTaskbar = false就好像您很快就可以看到该窗口出现在任务栏中一样。

用户永远不会“看到”窗口,因为它位于屏幕之外Int32.MaxValue- 这是早期多媒体创作(例如 Macromedia/Adobe Director)中常见的技巧。

对于搜索和找到这个问题的人,我可以告诉你没有其他办法强制渲染文档。

HTH,

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

另存为 XPS 文档的 FlowDocument 中缺少图像 的相关文章

  • 如何在C#背后的代码中动态创建数据模板并绑定TreeView分层数据

    我有一个场景 其中树视图动态更改其数据模板和数据绑定定义 我在 XAML 中创建了一个树视图 如下所示
  • flutter应用程序中有图像编辑器的api吗?我需要在图像中添加文本

    是否可以编辑图像 例如旋转以及在图像上添加文本 有没有什么插件可以做到这一点 我需要一个图像编辑器来添加具有各种字体和颜色的文本 谢谢 你应该使用重画边界 https docs flutter io flutter widgets Repa
  • Java 旋转图像

    Override public void paintComponent Graphics g super paintComponent g Graphics2D g2 Graphics2D g create rotation of play
  • 如何使 WPF 应用程序在 Web 浏览器上运行

    我们有一个用 WPF 编写的现有应用程序 我们正在寻找一种迁移它的方法 以便它可以在 Web 浏览器上运行 深入研究后 我们似乎需要找到一种将代码编译为 WebAssembly 的方法 但我不确定它对于现有的完全加载的 WPF 应用程序有多
  • CommandManager.InvalidateRequerySuggested 不会导致对 MVVM-Light 中的 CanExecute 进行重新查询

    我正在使用 MVVM Light RelayCommand private ICommand myRevertCmd public ICommand Revert get if myRevertCmd null myRevertCmd ne
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • WPF - 如何从 DataGridRow 获取单元格?

    我有一个具有交替行背景颜色的数据绑定 DataGrid 我想根据单元格包含的数据对单元格进行不同的着色 我已经尝试过该线程建议的解决方案 http wpf codeplex com Thread View aspx ThreadId 511
  • 将 SVG 文件转换为多个不同大小的 PNG 文件

    我有一个 SVG 格式的徽标图像 我想知道是否有办法生成多个不同大小的 png 文件 例如 我设置了 20 个不同的宽度和高度 它会生成 20 个 PNG 文件 如果我必须一次处理 5 张图像也没关系 我已经安装了 illustrator
  • 如何在wpf中翻转图像

    我最近学习了如何使用 TransformedBitmap 和 RotateTransformed 类旋转 BitmapImage 现在我可以对图像进行顺时针旋转 但如何翻转图像呢 我找不到执行 BitmapImage 水平和垂直翻转的类 请
  • WPF控件默认大小

    为 wpf 应用程序定义自定义资源主题时 我可以设置宽度 高度等 如何找到这些属性的默认值 即框架中提供的控件中使用的值 WPF 控件通常不包含任何类型的默认大小 WPF 的主要功能点之一是 除非您指定大小 否则所有内容都会动态调整大小 如
  • 无法将像素着色器渲染到 RenderTargetBitmap!请帮忙!

    我编写了一个非常简单的 WPF 应用程序来测试渲染具有与 RenderTargetBitmap 关联的像素着色器的控件的能力 然后我将位图写入文件 jpeg 该控件被渲染到位图上 但是像素着色器效果不会应用于该控件 代码和 XAML 如下
  • 包含内容的 WPF 新窗口

    我想在现有的主 Windwoe 旁边创建一个带有可滚动文本框的新窗口 我在主窗口中按下 打开新窗口 按钮 然后它应该打开一个带有可滚动文本框的新窗口 inside form2 在 WPF 中 您可以在主窗口中拖放元素 但不能在新窗口中执行此
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 如何将图像放入此 UIPickerView 中?

    我不知道如何创建一个在文本一侧带有图像的自定义 UIPickerView 我一直在寻找一种方法 我刚刚发现了这个 UIView pickerView UIPickerView pickerView viewForRow NSInteger
  • 将一幅图像合成到另一幅图像上时,RMagick 透明度不起作用

    在下面的代码中 我尝试在一些山脉的图像上覆盖一个透明的正方形 我认为它会起作用 但是通过设置background color none 它不会使图像透明 结果是左上角有一个黑色方块 所需的结果是黑色方块应该是透明的 require open
  • 主从视图中聚合详细信息值

    我在一些自定义实体中有主从关系 假设我有以下结构 class Master INotifyPropertyChanged public int Id get set property changed implementation publi
  • 当 AutoGenerateColumns = True 时如何重命名 DataGrid 列?

    我有一个简单的数据结构类 public class Client public String name set get public String claim number set get 我正在将其喂入DataGrid this data
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐