2014-09-30 23 views
5

Bir RTF dizesini C# içindeki bir XAML dizesine dönüştürmenin en etkili yolu nedir? System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent)'u kullanmak istiyorum ama maalesef bu sınıf dahili.RTF dizesini XAML dizesine dönüştürme

+0

'Xaml dizesi nedir? –

+1

@MehdiKhademloo [tag wiki] 'yi okuyun (http://stackoverflow.com/tags/xaml/info) –

+0

Bunu biliyorum, Ama '' RTAM dizesi' ile ilgili 'XAML dizesi' bana garip geliyor ... –

cevap

5

Bir XAML dizesine bir RTF dizesinden gidebilirsiniz ama görüntüleri kaybetmek:

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

:

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); 
     } 
    } 
} 

bir XAML paketine bir RTF dizesinden gitmek zorunda görüntüleri korumak için System.Windows.Documents iç yöntemi XamlRtfConverter çağırmak için System.Reflection kullanın (PresentationFramework.dll başvuru). Parallel.ForEach() 'da bellek çökmeleri olmadan (RichTextBox ile dönüşümün aksine) binlerce dönüşüm için çalışır.

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; 
    } 
İlgili konular