【问题标题】:.NET WPF Application : Loading a resourced .XPS document.NET WPF 应用程序:加载资源化的 .XPS 文档
【发布时间】:2021-08-25 23:02:39
【问题描述】:

我正在尝试将 .xps 文档加载到我的 WPF 应用程序中的 DocumentViewer 对象中。一切正常,除非我尝试加载资源 .xps 文档。使用绝对路径时,我可以正常加载 .xps 文档,但是当我尝试加载资源文档时,它会抛出“DirectoryNotFoundException”

这是我加载文档的代码示例。

     using System.Windows.Xps.Packaging;

      private void Window_Loaded(object sender, RoutedEventArgs e)
        {
//Absolute Path works (below)
            //var xpsDocument = new XpsDocument(@"C:\Users\..\Visual Studio 2008\Projects\MyProject\MyProject\Docs\MyDocument.xps", FileAccess.Read); 
//Resource Path doesn't work (below)
var xpsDocument = new XpsDocument(@"\MyProject;component/Docs/Mydocument.xps", FileAccess.Read);
            DocumentViewer.Document = xpsDocument.GetFixedDocumentSequence();
        }

当抛出 DirectoryNotFoundException 时,它显示“找不到路径的一部分:'C:\MyProject;component\Docs\MyDocument.xps'

它似乎正试图从该路径中获取 .xps 文档,就好像它是计算机上的实际路径一样,而不是试图从存储为应用程序内资源的 .xps 中获取。

【问题讨论】:

    标签: .net wpf xpsdocument documentviewer


    【解决方案1】:

    XpsDocument ctor 接受文件路径或Package 实例。以下是打开包以使用后一种方法的方法:

    var uri = new Uri("pack://application:,,,/Docs/Mydocument.xps");
    var stream = Application.GetResourceStream(uri).Stream;
    Package package = Package.Open(stream);
    PackageStore.AddPackage(uri, package);
    var xpsDoc = new XpsDocument(package, CompressionOption.Maximum, uri.AbsoluteUri);
    var fixedDocumentSequence = xpsDoc.GetFixedDocumentSequence();
    _vw.Document = fixedDocumentSequence; // displaying document in viewer
    xpsDoc.Close();
    

    【讨论】:

    • 即使在执行了上面列出的操作之后,它似乎仍在尝试读取我放入参数中的任何字符串作为实际路径。例如,我在参数中输入了@"Docs/Mydocument.xps",它会抛出错误,因为它正在查看 C:\docs\mydocument.xps 路径。
    • 在意识到XpsDocument ctor 接受文件路径而不是 URI 后,我编辑了我的帖子。
    • 我再次对其进行了编辑,添加了对包的修改。丑陋,但它有效。
    • 你帮了大忙。谢谢!
    • 请注意,调用PackageStore.AddPackage() 是不必要的。来自Microsoft docs:“使用 XpsDocument 构造函数打开的 XPS 包会在创建和处理文档时自动从 PackageStore 添加和删除。(对于使用 XpsDocument 构造函数打开的 XPS 包,您不需要单独调用 AddPackage 或 RemovePackage。) "
    【解决方案2】:

    我无法使用包加载 XPS 文档,无论如何,将文档包装在包中以便能够加载它似乎是一种不必要的解决方法。

    如果将 XPS 文档的构建操作设置为 Resource 不是硬性要求,则可以通过将文档的构建操作设置为 Content(并设置“复制到输出目录”)。

    var docPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "Docs/MyDocument.xps");
    using var document = new XpsDocument(termsPath, FileAccess.Read);
    _vw.Document = document.GetFixedDocumentSequence();
    document.Close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2017-11-18
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多