Мы используем 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}}}}
Отображаемый текст экранирован и все в порядке.Но URL не в порядке.Как только текст Rtf загружен, XamParseException вызывается.Внутренним исключением является UriFormatException с недействительным Uri, поскольку имя хоста не может быть разрешено.
Я уже провел веб-исследование и не смог найти никаких потенциальных решений.Например, WordPad работает нормально и создает правильный текст Rtf.
Конечно, я могу разобрать Rtf для гиперссылок и попытаться исправить ссылку самостоятельно (со всеми проблемами).Я отлаживал код в соответствующих классах Microsoft, и с моей точки зрения проблемы связаны с ним.
Есть ли простой способ решить эту проблему?Я что-то пропустил?
Спасибо за любые идеи, подсказки ... Торстен