none
使用XamlWriter序列化RichTextBox遇到的Bug? RRS feed

  • 问题

  • 代码超简单

    xaml:

     

    <Window x:Class="WpfApplication1.RichTextBox"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="RichTextBox" Height="500" Width="500">
      <StackPanel>
        <RichTextBox x:Name="richTB" Height="230">
        </RichTextBox>
        <Button Click="Button_Click">Click</Button>
        <FlowDocumentScrollViewer>
          <FlowDocument x:Name="doc">
            
          </FlowDocument>
        </FlowDocumentScrollViewer>
      </StackPanel>
    </Window>
    

     


    cs

     

    private void Button_Click(object sender, RoutedEventArgs e)
        {
          Section section = new Section();
          while (richTB.Document.Blocks.Count > 0)
          {
            section.Blocks.Add(richTB.Document.Blocks.FirstBlock);
          }
    
          string xaml = XamlWriter.Save(section); //<--这里
    
          Section xamlDoc = (Section)XamlReader.Load(XmlReader.Create(new StringReader(xaml)));
          doc.Blocks.Add(xamlDoc);
          
        }
    

     

    运行后,在打开搜狗输入法右键-->表情&符号-->字符画,点击一头猪,如下:

     

     

    ╭︿︿︿╮ 

    {/ o  o /}  

     ( (oo) )   

      ︶ ︶︶

    (或直接拷贝上图到RichTextBox)

     

    然后点击中间的按钮,进行序列化后再反序列化后输出到下面的FlowDocument中

    然后就会神奇地发现那头猪变成了如下模样:

    ╭︿︿︿╮ 

    {}{/ o  o /}  

     ( (oo) )   

      ︶ ︶︶

    弄了一天,超蛋疼的 T.T

    这是序列化的bug吗?

    注:运行程序后若先手动输几个字符,就不会出现如上情况了

    2011年8月23日 12:18

答案

  • {}是XAML escape sequence, 详细的信息你可以参考这篇MSDN文档:

    http://msdn.microsoft.com/en-us/library/ms744986.aspx

    这个其实根本不影响你的序列化与反序列化,如果你非要找到一个workaround,你可以使用下面的代码:

     

    string xaml = GetXaml(richTB.Document);
    MessageBox.Show(xaml);
    System.IO.StringReader sr = new System.IO.StringReader(xaml);
    System.Xml.XmlReader xr = System.Xml.XmlReader.Create(sr);
    richTB.Document = (FlowDocument)System.Windows.Markup.XamlReader.Load(xr);
    


     

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


     

    Best regards,
    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Behindmoon 2011年8月26日 11:17
    2011年8月25日 8:19
    版主

全部回复

  • {}是XAML escape sequence, 详细的信息你可以参考这篇MSDN文档:

    http://msdn.microsoft.com/en-us/library/ms744986.aspx

    这个其实根本不影响你的序列化与反序列化,如果你非要找到一个workaround,你可以使用下面的代码:

     

    string xaml = GetXaml(richTB.Document);
    MessageBox.Show(xaml);
    System.IO.StringReader sr = new System.IO.StringReader(xaml);
    System.Xml.XmlReader xr = System.Xml.XmlReader.Create(sr);
    richTB.Document = (FlowDocument)System.Windows.Markup.XamlReader.Load(xr);
    


     

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


     

    Best regards,
    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Behindmoon 2011年8月26日 11:17
    2011年8月25日 8:19
    版主
  • 这个很好用!
    2011年8月26日 11:18