Замените RichTextBox Text, но продолжайте форматирование - PullRequest
4 голосов
/ 15 января 2011

Кто-нибудь может пролить свет на это для меня, у меня есть RichTextBox, который загружает в него файл xaml. Мне нужно заменить некоторые части текста RichTxtBox реальными данными, т.е. «[наше_имя]» заменено на «Билли Брэгс» Мой файл 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 ]

5 голосов
/ 17 января 2011

Это работает, вот как я это сделал в конце, не слишком красиво, но он работает.WPF RTB действительно должен иметь свойство rtf, например winforms ...

Спасибо Кенту за то, что он поставил меня на правильный путь.

            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 голос
/ 16 января 2011

Полагаю, вам нужно сохранить содержимое TextRange в формате RTF, а затем перезагрузить содержимое 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);
}
...