我们在应用程序中使用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类中,从我的角度来看,问题与之相关。
有没有简单的方法可以解决此问题?我有想念吗?
感谢任何想法,提示... 托斯滕