日期:2014-05-17  浏览次数:20823 次

|ZYCWPF| 为什么RichTextBox导出后,我发现Margin好没有导出呢?谢谢
我用

            TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
            using (MemoryStream ms = new MemoryStream())
            {
                textRange.Save(ms, System.Windows.DataFormats.Rtf);
                ms.Seek(0, SeekOrigin.Begin);
                StreamReader sr = new StreamReader(ms);
                var rtf = sr.ReadToEnd();
                File.WriteAllText("rtfsample.rtf", rtf);
            }

导出RichTextBox内容
然后用Word打开,发现Margin都无效了
然后再用

            var fs = new FileStream("rtfsample.rtf", FileMode.Open, FileAccess.Read);

            StreamReader streamReader = new StreamReader(fs, System.Text.Encoding.UTF8);

            using (fs)
            {
                TextRange text = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
                text.Load(fs, DataFormats.Rtf);
            }
            streamReader.Dispose();
            streamReader = null;
            fs.Dispose();
            fs = null;

Load回来后发现Margin全为"0,0,0,0"
------解决方案--------------------
rtf没有Margin属性,你需要另外保存FlowDocument的其余属性。
------解决方案--------------------
先去了解rtf的格式
http://baike.baidu.com/view/18817.htm
------解决方案--------------------
http://www.microsoft.com/en-us/download/details.aspx?id=10725
------解决方案--------------------
rtf可以用\sa \sb来控制段落的间距。
http://msdn.microsoft.com/en-us/library/aa140283(v=office.10).aspx#rtfspec_20

我试了导出到rtf后,margin是保留的。从rtf再读入后margin也是正确的。

你会看到导入、导出前后段落间隔不一致,这是因为如果不写margin,导出后margin缺省就是0。而在rtb中,如果不写margin,缺省是字体高度*行间距。

你可以把paragraph的缺省margin设成0,这样rtb和word中就可以看到同样的效果。
或者可以在导入rtf后,取得document的xaml,然后删掉里面的 Margin="0,0,0,0" 这样的字符串,再重新装载,这样可以让导出/导入前后的效果一致。