将 rtf 字符串加载到 TextRange 中不包括换行符

Posted

技术标签:

【中文标题】将 rtf 字符串加载到 TextRange 中不包括换行符【英文标题】:Loading rtf string into TextRange doesnt include line breaks 【发布时间】:2018-10-01 09:32:46 【问题描述】:

我有一个方法可以设置文本范围和 rtf 字符串。我的问题是在将其加载到 TextRange 时,它​​会丢失换行符。当我从内存流加载 rtf 字符串时,如何确保我的换行符存在?目前我的方法如下:

    public static void LoadRtf(string rtf, TextRange range)
    
        if (string.IsNullOrEmpty(rtf))
            return;

        using (MemoryStream rtfMemoryStream = new MemoryStream())
        
            using (StreamWriter rtfStreamWriter = new StreamWriter(rtfMemoryStream))
            
                rtfStreamWriter.Write(rtf);
                rtfStreamWriter.Flush();
                rtfMemoryStream.Seek(0, SeekOrigin.Begin);

                range.Load(rtfMemoryStream, DataFormats.Rtf);
            
        
    

扩展 RichTextBox 的调用类

public class RtfBox : RichTextBox

    public object RtfContent
    
        get  return GetValue(RtfContentProperty); 
        set  SetValue(RtfContentProperty, value); 
    

    public static readonly DependencyProperty RtfContentProperty =
        DependencyProperty.RegisterAttached("RtfContent", typeof(object), typeof(RtfBox),
                                            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, RtfContentChanged));

    static void RtfContentChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs evt)
    
        RtfBox box = depObj as RtfBox;
        if (box == null)
            return;

        string sContent = evt.NewValue as string;
        if (sContent == null)
        
            byte[] bContent = evt.NewValue as byte[];
            if (bContent != null)
                sContent = Encoding.UTF8.GetString(bContent);
        

        box.Document.Blocks.Clear();

        try
        
            TextRange range = new TextRange(box.Document.ContentStart, box.Document.ContentEnd);
            FlowDocumentRtfConverter.LoadRtf(sContent, range);

            if (box.Document.FontStyle == FontStyles.Normal)
                box.Document.FontStyle = box.FontStyle;
            if (box.Document.FontWeight == FontWeights.Normal)
                box.Document.FontWeight = box.FontWeight;
            if (box.Document.FontStretch == FontStretches.Normal)
                box.Document.FontStretch = box.FontStretch;

        
        catch (Exception e)
        
        
    

    public RtfBox()
        : base()
    
        IsDocumentEnabled = false;
    

我当前使用的 rtf 字符串值是“H\0e\0l\0l\0o\0\r\0\n\02\0n\0d\0 \0l\0i\0n\0e\0\ r\0" 也许这有什么问题?

【问题讨论】:

【参考方案1】:

我尝试了您的代码并稍作修改,如下所示,它对我有用。也许这是您初始化文本范围的方式?

        public static string LoadRtf(string rtf, TextRange range)
        
            if (string.IsNullOrEmpty(rtf))
                return "";

            using (MemoryStream rtfMemoryStream = new MemoryStream())
            
                using (StreamWriter rtfStreamWriter = new StreamWriter(rtfMemoryStream))
                
                    rtfStreamWriter.Write(rtf);
                    rtfStreamWriter.Flush();
                    rtfMemoryStream.Seek(0, SeekOrigin.Begin);

                    range.Load(rtfMemoryStream, DataFormats.Rtf);
                
            

            return range.Text;
        

然后我调用了这段代码,返回的字符串有换行符,并在富文本框控件中正确显示。

string rtf = File.ReadAllText(@"c:\temp\document.rtf");

FlowDocument flowDocument = new FlowDocument();
TextRange range = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);

this.richTextBox1.Text = LoadRtf(rtf, range);

【讨论】:

如果可以为您提供更多有用信息,我添加了调用类。我仍然没有运气。 我将 range.Load 更改为使用 DataFormats.Text,现在它考虑了换行符【参考方案2】:

我将 range.Load 更改为使用 DataFormats.Text,现在它考虑了换行符。

【讨论】:

以上是关于将 rtf 字符串加载到 TextRange 中不包括换行符的主要内容,如果未能解决你的问题,请参考以下文章

将rtf文件加载到Swift 2中的UITextView中

在控制台应用程序中将带有图像的 RTF 文件加载到 FlowDocument

在使用VB的RichTextBox控件时加载文档(RTF)出现错误,应用程序出错,不能写入。

如何将 RTF 文本复制到剪贴板以在 excel 中使用

Internet Explorer TextRange 中的字符偏移

如何在 C# 中将文本提取/插入到 RTF 字符串中