2010-04-12 2 views
0

일부 C# 소스 코드를 데이터베이스에 저장하려고합니다. 기본적으로 나는 사용자가 자신의 코드를 입력하고 데이터베이스에 저장할 수있는 RichTextBox 있습니다.WPF Richtextbox XamlWriter 동작

Visual Studio 환경에서 복사하여 붙여 넣을 때 formating 등을 보존하고 싶습니다. 그래서 FlowDocuments Xaml을 데이터베이스에 저장하고 이것을 RichTextBox.Document로 다시 설정했습니다.

아래의 두 가지 기능은 RTB의 내용을 직렬화하고 역 직렬화합니다.

 private string GetXaml(FlowDocument document) 
    { 
     if (document == null) return String.Empty; 
     else{ 
      StringBuilder sb = new StringBuilder(); 
      XmlWriter xw = XmlWriter.Create(sb); 
      XamlDesignerSerializationManager sm = new XamlDesignerSerializationManager(xw); 
      sm.XamlWriterMode = XamlWriterMode.Expression;     

      XamlWriter.Save(document, sm); 
      return sb.ToString(); 
     } 
    } 

    private FlowDocument GetFlowDocument(string xamlText) 
    { 
     var flowDocument = new FlowDocument(); 
     if (xamlText != null) flowDocument = (FlowDocument)XamlReader.Parse(xamlText); 
     // Set return value 
     return flowDocument; 
    } 

나는 다음과 같은 코드에는 직렬화 및 deserialise 할 때 그러나, 나는

using System; 
public class TestCSScript : MarshalByRefObject 
{ 

} 

직렬화 된 XAML은

using System; public class TestCSScript : MarshalByRefObject {}{ }

공지 사항입니다이 잘못된 (?) 동작을 나타 납니까하여 "{}"의 새로운 세트

나는 무엇을 할까? 잘못된 여기에 ... 도움에 미리 감사드립니다!

+2

나에게 버그처럼 보입니다. Microsoft Connect에서보고했습니다. https://connect.microsoft.com/WPF/feedback/details/563677/wpf-paragraphs-with-a-leading-curly- 브래킷 -하지 - xamlwriter - 저장 - 올바르게 –

+0

감사합니다 - 내가 혼자가 아니란 것을 알게되어 기쁘다 – Krishna

답변

0

저는 지각 해법을 사임했지만 아무도 깨끗한 답을 찾지 못하면 게시하십시오.

원하지 않는 문자를 제거하기 위해 Replacebuild 호출을 사용했습니다.

private string GetXaml(FlowDocument document) 
    { 
     if (document == null) return String.Empty; 
     else 
     { 

      StringBuilder sb = new StringBuilder(); 
      using (XmlWriter xw = XmlWriter.Create(sb)) 
      { 
       XamlDesignerSerializationManager sm = new XamlDesignerSerializationManager(xw); 
       sm.XamlWriterMode = XamlWriterMode.Expression; 

       XamlWriter.Save(document, sm); 
      } 
      sb.Replace("{}", ""); 
      return sb.ToString(); 
     } 

    } 

xamlwriter가 "{"문자를 만날 때 느낌이 들었습니다.이 문자는 바인딩 식으로 해석합니다. 이스케이프 시퀀스가이 캐릭터에 어떤 것인지 궁금합니다.

주 - 나는 기쁨으로

XamlWriterMode from XamlWriterMode.Expression to XamlWriterMode.Value 

을 변경했습니다.

+2

{}는 [XAML 이스케이프 시퀀스] (http://msdn.microsoft.com/en-us/library/ms744986)입니다. .aspx) 그래서 당신이보고있는 것은 완벽하게 유효합니다. 진짜 질문은 : 왜 이것이 당신을 괴롭히는가? 귀하의 의도는 분명히 당신을 위해 일하는 XAML에서 /로 FlowDocument를 직렬화하는 것입니다. 그렇다면 왜 {}에 대해 소란스러워할까요? 직렬화 된 내용을 해석해서는 안됩니다. – wpfwannabe

+1

serialize하려고하는 내용은 C# 코드입니다. 직렬화 된 내용을 다시 리치 텍스트 상자에 다시로드하면 {}의 새 집합이 내 코드를 컴파일 할 수 없게 만듭니다. 임의의 직렬화의 다음의 반복에서는, 각 {{}에 대해 새로운 {} 세트가 추가됩니다. (FlowDocument) XamlReader.Parse (xamlText);은 이러한 문자를 제거하지 않습니다. 그 직렬화 비트 이해하지만 deserialising 때 - 독자가 이스케이프 시퀀스를 제거하면 안됩니다 – Krishna