加载并保存RTF FlowDocument

时间:2019-05-21 08:52:35

标签: c# wpf richtextbox rtf flowdocument

我们在应用程序中使用RichTextBox(FlowDocument)。用户可以输入并粘贴文本和超链接。可以加载和保存此FlowDocument的内容。我们需要以Rtf格式保存内容,以便能够将其用于其他技术,例如Java。除非FlowDocument在NavigateUri中包含带有变音符号的超链接,否则所有方法都可以正常工作。从我的角度来看,已保存/生成的Rtf文本已损坏/错误。如果我们尝试加载此文件,则会导致崩溃。

请在下面找到一个简单且精简的示例来演示崩溃。只需单击按钮即可结束崩溃。

    <DockPanel>
    <Button DockPanel.Dock="Bottom" Click="SaveAndLoadClick">Save and Load</Button>
    <RichTextBox IsDocumentEnabled="True" Name="richTextBox">
        <FlowDocument>
            <Paragraph>
                <Hyperlink Foreground="#FF0066CC" NavigateUri="http://www.öffnen.de" TextDecorations="Underline">www.öffnen.de</Hyperlink>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>
</DockPanel>

后面的相应代码:

    public partial class MainWindow {
    public MainWindow() {
        InitializeComponent();
    }

    private static void SetRtfText(FlowDocument document, string rtfText) {
        var textRange = new TextRange(document.ContentStart, document.ContentEnd);
        using (var stream = new MemoryStream(Encoding.Default.GetBytes(rtfText)))
            textRange.Load(stream, DataFormats.Rtf);
    }

    private static string GetRtfText(FlowDocument document) {
        var textRange = new TextRange(document.ContentStart, document.ContentEnd);
        using (var stream = new MemoryStream()) {
            textRange.Save(stream, DataFormats.Rtf);
            stream.Position = 0;
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    private void SaveAndLoadClick(object sender, RoutedEventArgs e) {
        var text = GetRtfText(richTextBox.Document);
        SetRtfText(richTextBox.Document, text);
    }
}

从我的角度来看,问题在于创建的Rtf文本。请查看以下摘录:

{\field{\*\fldinst { HYPERLINK "http://www.'f6ffnen.de" }}{\fldrslt {www.\'f6ffnen.de}}}}

显示的文本已转义并且可以。但是网址不正确。一旦加载Rtf文本,就会引发XamParseException。内部异常是一个UriFormatException,其中Uri无效,因为无法解析主机名。

我已经进行了一次网络调查,但找不到任何潜在的解决方案。例如,写字板工作正常,可以创建正确的Rtf文本。

当然,我可以解析Rtf中的超链接,并尝试自己纠正链接(面临所有挑战)。我将代码调试到了相应的Microsoft类中,从我的角度来看,问题与之相关。

有没有简单的方法可以解决此问题?我有想念吗?

感谢任何想法,提示... 托斯滕

0 个答案:

没有答案