2010-04-12 5 views
0

J'essaie d'enregistrer du code source C# dans la base de données. Fondamentalement, j'ai un RichTextBox que les utilisateurs peuvent taper leur code et l'enregistrer dans la base de données. Lorsque je copie et collez à partir de l'environnement Visual Studio, je souhaite conserver le formatage, etc. J'ai donc choisi d'enregistrer FlowDocuments Xaml dans la base de données et de le renvoyer au fichier RichTextBox.Document.WPF Richtextbox Comportement XamlWriter

Mes fonctions ci-dessous sérialisent et désérialisent le contenu du 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; 
    } 

Cependant lorsque je tente de serialise et deserialise le code suivant, je note ce comportement incorrect (?)

using System; 
public class TestCSScript : MarshalByRefObject 
{ 

} 

sérialisé XAML est

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

Notez que le la nouveau jeu de "{}"

Que suis-je? oing tort ici ... Merci d'avance pour l'aide!

+2

Cela me semble un bug - je l'ai signalé à Microsoft Connect: https://connect.microsoft.com/WPF/feedback/details/563677/wpf-paragraphs-with-a-leading-curly- bracket-do-not-xamlwriter-save-correctement –

+0

merci - heureux de savoir que je ne suis pas seul – Krishna

Répondre

0

Je me suis résigné à une solution tardive pour l'instant, mais si l'un d'entre vous en trouve un propre, merci de le poster.

J'ai utilisé un appel Remplacer de Stringbuilder pour supprimer les caractères indésirables.

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

    } 

J'ai le sentiment que lorsque les rencontres XamlWriter « { » caractère - il intreprets que comme une expression de liaison. Je me demande quelle est la séquence d'échappement pour ce personnage.

Remarque - j'ai essayé de changer le

XamlWriterMode from XamlWriterMode.Expression to XamlWriterMode.Value 

sans joie.

+2

{} est une [séquence d'échappement XAML] (http://msdn.microsoft.com/en-us/library/ms744986 .aspx) alors ce que vous voyez est parfaitement valide. La vraie question est: pourquoi cela vous dérange-t-il? Votre intention est de (dé) sérialiser un FlowDocument dans/depuis XAML qui fonctionne évidemment pour vous. Alors pourquoi faire des histoires à propos de {}? Vous ne devriez pas essayer d'interpréter le contenu sérialisé. – wpfwannabe

+1

le contenu que j'essaie de sérialiser est le code C#. lorsque je recharge le contenu sérialisé à la zone richtext, le nouvel ensemble de {} rendrait mon code non compilable. Les prochaines itérations de toute sérialisation ajouteront un nouvel ensemble de {} pour chaque {rencontré. Veuillez noter que (FlowDocument) XamlReader.Parse (xamlText); ne supprime pas ces caractères. Je comprends ce bit sérialisé, mais lors de la désérialisation - le lecteur ne devrait pas supprimer la séquence d'échappement – Krishna