2009-02-25 7 views
3

Notre testeur a jeté des accolades à nos RichTextBox persistants. Sur sauvegarder et rouvrir, il y a magiquement plus d'accolades.Pourquoi y a-t-il des accolades auto-duplicantes dans la version persistante de WPT RichTextBox?

J'ai condensé le problème/le code.

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"></RowDefinition> 
     <RowDefinition Height="Auto"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 

    <RichTextBox x:Name="rtb1" /> 
    <Button Grid.Row="1" Click="Button_Click">Draw a fish</Button> 
    <RichTextBox x:Name="rtb2" Grid.Row="2"/> 
</Grid> 
</Window> 

Deux zones de texte enrichi. Lors d'un clic sur un bouton, le bouton inférieur est défini sur le résultat du premier après persister et restaurer.

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      rtb1.Document = new FlowDocument(new Paragraph(new Run("{"))); 
     } 


     public static FlowDocument CreateFlowDocumentFromByteArray(byte[] byteArray) 
     { 
      return (FlowDocument)XamlReader.Load(new MemoryStream(byteArray)); 
     } 

     public static byte[] CreateByteArrayFromFlowDocument(FlowDocument flowDocument) 
     { 
      MemoryStream mStream = new MemoryStream(); 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = false; 
      settings.OmitXmlDeclaration = true; 
      XamlDesignerSerializationManager dsm = new XamlDesignerSerializationManager(XmlWriter.Create(mStream, settings)); 
      dsm.XamlWriterMode = XamlWriterMode.Value; 
      XamlWriter.Save(flowDocument, dsm); 
      mStream.Close(); 
      return mStream.ToArray(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      rtb2.Document = CreateFlowDocumentFromByteArray(CreateByteArrayFromFlowDocument(rtb1.Document)); 
     } 

    } 
} 

Pourquoi cela se produit-il? Comment pouvons-nous l'arrêter?

+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 –

Répondre

1

Je vais tester le code plus à fond ce soir, mais est-ce que ça arrive quand les accolades ne sont pas au début du texte? Par exemple, si votre course était "Hello {World}", est-ce encore le cas?

Comme vous le savez probablement, les accolades sont importantes dans WPF car elles sont utilisées pour les extensions de balisage. Le balisage suivant ne fonctionnerait pas:

<Button Content="{Hello}" /> 

Pour obtenir la sortie à droite, vous feriez habituellement échapper avec:

<Button Content="{}{Hello}" /> 

Puisque vous utilisez XamlReader.Load, il peut y avoir une certaine confusion autour de l'utilisation de {} dans le XAML, de sorte qu'ils sont échappés. Mais c'est juste une supposition. Par intérêt, à quoi ressemble le XAML qui est écrit?

+0

Il ne le fait que quand il est au début. Lorsque vous l'écrivez, il a {} { – Donnelle

+0

Pour être plus précis, cela se produit uniquement lorsque les accolades sont au début d'un paragraphe. Nous avons une solution de contournement (puisque nous marchions déjà dans l'arbre en appliquant des styles) mais c'est juste plus de frais généraux, et nous sommes assez frustrés que cela se soit produit du tout. – Donnelle

Questions connexes