Qual è il modo più efficiente per convertire una stringa RTF in una stringa XAML in C#? Mi piacerebbe usare System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent)
ma sfortunatamente quella classe è interna.Converti stringa RTF in stringa XAML
5
A
risposta
5
Si può andare da una stringa RTF a una stringa XAML, ma si perde le immagini:
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);
}
}
}
per conservare le immagini si deve passare da una stringa RTF a un pacchetto 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);
}
}
1
Utilizzare System.Reflection per richiamare il metodo interno XamlRtfConverter in System.Windows.Documents (deve fare riferimento a PresentationFramework.dll). Funziona per migliaia di conversioni in Parallel.ForEach() senza problemi di memoria (contrariamente alla conversione tramite 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;
}
cos'è una stringa Xaml? –
@MehdiKhademloo Leggi il [tag wiki] (http://stackoverflow.com/tags/xaml/info) –
Lo so, ma la 'stringa XAML 'relativa a' stringa RTF' è strana per me ... –