替换RichTextBox文本但保持格式

时间:2011-01-15 16:33:03

标签: wpf replace richtextbox

任何人都可以为我提供一些指示,我有一个RichTextBox,我将xaml文件加载到其中。我需要用真实数据替换RichTxtBox文本的某些部分,即'[our_name]'替换为'Billie Brags'。我的xaml文件包含粗体和格式等格式。字体大小。

当我运行我的代码(如下所示)时,我可以更改文本,但我会丢失格式。

知道如何做到这一点并保持格式化吗?

谢谢

            FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            using (fs)
            {
                TextRange RTBText = new TextRange(rtb_wording.Document.ContentStart, rtb_wording.Document.ContentEnd);
                RTBText.Load(fs, DataFormats.Xaml);
            }



        TextRange tr = new TextRange(rtb_wording.Document.ContentStart, rtb_wording.Document.ContentEnd);
        string rtbContent = tr.Text;
        rtbContent = rtbContent.Replace("<our_name>", "Billie Brags");
        System.Windows.MessageBox.Show(rtbContent);

        FlowDocument myFlowDoc = new FlowDocument();

        // Add paragraphs to the FlowDocument
        myFlowDoc.Blocks.Add(new Paragraph(new Run(rtbContent)));
        rtb_wording.Document = myFlowDoc;

2 个答案:

答案 0 :(得分:5)

它的工作,这就是我最终做到的,不是太漂亮但它的功能。 WPF RTB真的应该有像winforms一样的rtf属性......

感谢肯特让我走上正轨。

            var textRange = new TextRange(rtb_wording.Document.ContentStart, rtb_wording.Document.ContentEnd);
            string rtf;
            using (var memoryStream = new MemoryStream())
            {
                textRange.Save(memoryStream, DataFormats.Rtf);
                rtf = ASCIIEncoding.Default.GetString(memoryStream.ToArray());
            }

            rtf = rtf.Replace("<our_name>", "Bob Cratchet");

            MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(rtf));
            rtb_wording.SelectAll();
            rtb_wording.Selection.Load(stream, DataFormats.Rtf);

答案 1 :(得分:1)

我相信您需要以RTF格式保存TextRange的内容,然后重新加载RTB的内容。我没有尝试过这个,所以不确定它是否会起作用(目前在linux上无法测试):

var textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
string rtf;

using (var memoryStream = new MemoryStream())
using (var streamReader = new StreamReader(memoryStream))
{
    textRange.Save(memoryStream, DataFormats.Rtf);
    rtf = streamReader.ReadToEnd();
}

rtf = rtf.Replace("<whatever>", "whatever else");

using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(rtf)))
{
    textRange.Load(memoryStream, DataFormats.Rtf);
}