从XamlPackage加载:无法识别的数据格式结构';XamlPackage';

本文关键字:XamlPackage 数据 格式结构 识别 加载 | 更新日期: 2023-09-27 18:20:18

我有以下代码可以将RichTextBox保存到RTF并立即重新加载它-我之前在这个问题中发布过它,我用它来显示序列化/取消序列化RTF时的问题:

    public Stream GenerateStreamFromString(string s)
    {
        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(s);
        writer.Flush();
        stream.Position = 0;
        return stream;
    }
    private async void SaveAndReloadButton_Click(object sender, RoutedEventArgs e)
    {
        string data = null;
        var range = new TextRange(this.RichText.Document.ContentStart, this.RichText.Document.ContentEnd);
        using (var memoryStream = new MemoryStream())
        {
            range.Save(memoryStream, DataFormats.Rtf);
            memoryStream.Position = 0;
            using (StreamReader reader = new StreamReader(memoryStream))
            {
                data = await reader.ReadToEndAsync();
            }
        }
        // load
        var stream = GenerateStreamFromString(data);
        range = new TextRange(this.RichText.Document.ContentStart, this.RichText.Document.ContentEnd);
        range.Load(stream, DataFormats.Rtf);
    }

我现在正试图将格式更改为DataFormats.Rtf,这是我从这篇博客文章中发现的一种格式。现在,如果我在上面的代码中简单地用DataFormats.XamlPackage替换DataFormats.XamlPackage,我在调用range.Load(...)时会得到以下异常:

中发生类型为"System.ArgumentException"的异常PresentationFramework.dll,但未在用户代码中处理

附加信息:数据格式中无法识别的结构"XamlPackage"。

有人能解释为什么会发生这种情况吗?

从XamlPackage加载:无法识别的数据格式结构';XamlPackage';

嗯,XamlPackage是一种二进制格式,由于某种原因,将它放入字符串会使它变得一团糟。直接使用MemoryStream或文件工作效果良好:

    private void SaveAndReloadButton_Click(object sender, RoutedEventArgs e)
    {
        var range = new TextRange(this.RichText.Document.ContentStart, this.RichText.Document.ContentEnd);
        using (var memoryStream = new MemoryStream())
        {
            range.Save(memoryStream, DataFormats.XamlPackage);
            memoryStream.Position = 0;
            // load
            range = new TextRange(this.RichText.Document.ContentStart, this.RichText.Document.ContentEnd);
            range.Load(memoryStream, DataFormats.XamlPackage);
        }
    }