2014-09-30 2 views
5

C#에서 RTF 문자열을 XAML 문자열로 변환하는 가장 효율적인 방법은 무엇입니까? System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent)을 사용하고 싶지만 불행히도 그 클래스는 내부적입니다.RTF 문자열을 XAML 문자열로 변환

+0

'Xaml 문자열'이란 무엇입니까? –

+1

@MehdiKhademloo [태그 위키] 읽기 (http://stackoverflow.com/tags/xaml/info) –

+0

RTF 문자열과 관련된 'XAML 문자열'은 저에게 이상합니다. –

답변

5

당신은 XAML 문자열에 RTF 문자열에서 갈 수 있지만 이미지 손실 :

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

당신이 XAML 패키지에 RTF 문자열에서 가야 이미지를 유지하기를 System.Reflection을 사용하여 System.Windows.Documents에서 내부 메서드 인 XamlRtfConverter를 호출합니다 (PresentationFramework.dll에 대한 참조가 필요함). RichTextBox를 통한 변환과 달리 메모리 충돌없이 Parallel.ForEach()에서 수천 회의 변환 작업을 수행합니다.

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; 
    } 
관련 문제