将RTF字符串转换为XAML字符串

5

如何以最高效的方式将RTF字符串转换为C#中的XAML字符串?我想使用System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent),但不幸的是,该类是内部的。


什么是 Xaml 字符串 - Mehdi Khademloo
1
@MehdiKhademloo 请阅读 标签维基 - Erwin Bolwidt
我知道,但与RTF字符串相关的XAML字符串对我来说很奇怪... - Mehdi Khademloo
请留下关于负评的评论。 - Robin
2个回答

5

您可以将RTF字符串转换为XAML字符串,但会丢失图像:

 var rtf = File.ReadAllText(rtfFileName);
 var doc = new FlowDocument();
 var range = new TextRange(doc.ContentStart, doc.ContentEnd);
 using (var inputStream = new MemoryStream(Encoding.ASCII.GetBytes(rtf)))
 {
    range.Load(inputStream, DataFormats.Rtf);
    using (var outputStream = new MemoryStream())
    {
       range.Save(outputStream, DataFormats.Xaml);
       outputStream.Position = 0;
       using (var xamlStream = new StreamReader(outputStream))
       {
          var xaml = xamlStream.ReadToEnd();
          File.WriteAllText(xamlFileName, xaml);
       }
    }
 }

为了保留图像,您需要将RTF字符串转换为XAML包:

 var rtf = File.ReadAllText(rtfFileName);
 var doc = new FlowDocument();
 var range = new TextRange(doc.ContentStart, doc.ContentEnd);
 using (var inputStream = new MemoryStream(Encoding.ASCII.GetBytes(rtf)))
 {
    range.Load(inputStream, DataFormats.Rtf);
    using (var outputStream = new FileStream(xamlFileName, FileMode.Create))
    {
       range.Save(outputStream, DataFormats.XamlPackage);
    }
 }

2
使用 System.Reflection 调用 System.Windows.Documents 中的内部方法 XamlRtfConverter(需要引用 PresentationFramework.dll)。通过 Parallel.ForEach() 进行数千次转换,不会出现内存崩溃问题(与 RichTextBox 转换相比)。
    private static string ConvertRtfToXaml(string rtfContent)
    {
        var assembly = Assembly.GetAssembly(typeof(System.Windows.FrameworkElement));
        var xamlRtfConverterType = assembly.GetType("System.Windows.Documents.XamlRtfConverter");
        var xamlRtfConverter = Activator.CreateInstance(xamlRtfConverterType, true);
        var convertRtfToXaml = xamlRtfConverterType.GetMethod("ConvertRtfToXaml", BindingFlags.Instance | BindingFlags.NonPublic);
        var xamlContent = (string)convertRtfToXaml.Invoke(xamlRtfConverter, new object[] { rtfContent });
        return xamlContent;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接