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

时间:2014-08-31 15:39:24

标签: c# wpf xaml richtextbox

我有以下代码将RichTextBox保存到RTF并立即重新加载 - 我之前已将其发布在this question中,我用它来显示序列化/反序列化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,这是我从this blog post发现的格式。现在,如果我只是在上面的代码中将DataFormats.XamlPackage替换为DataFormats.XamlPackage,那么在调用range.Load(...)时会出现以下异常:

  

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

     

其他信息:数据格式无法识别的结构   'XamlPackage'。

有人能说清楚为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

嗯,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);
        }
    }