Форматиране на думи в RichTextBox

Използвам следния код, за да намеря всеки ред, който започва с "@", и да го форматирам, като го направя удебелен:

foreach (var line in tweetText.Document.Blocks)
        {
            var text = new TextRange(line.ContentStart,
                           line.ContentEnd).Text;
            line.FontWeight = text.StartsWith("@") ?
                           FontWeights.Bold : FontWeights.Normal;
        }

Бих искал обаче да използвам кода, за да намеря всяка дума вместо ред, започващ с "@", за да мога да форматирам абзац като:

Бла бла бла @username бла бла бла бла @anotherusername


person Rhys Towey    schedule 07.08.2013    source източник


Отговори (2)


Вероятно това може да изисква известна оптимизация, тъй като го направих бързо, но това трябва да ви помогне да започнете

private void RichTextBox_TextChanged(object sender, TextChangedEventArgs e)
{    
     tweetText.TextChanged -= RichTextBox_TextChanged;
     int pos = tweetText.CaretPosition.GetOffsetToPosition(tweetText.Document.ContentEnd);

     foreach (Paragraph line in tweetText.Document.Blocks.ToList())
     {
        string text = new TextRange(line.ContentStart,line.ContentEnd).Text;

        line.Inlines.Clear();

        string[] wordSplit = text.Split(new char[] { ' ' });
        int count = 1;

        foreach (string word in wordSplit)
        {
            if (word.StartsWith("@"))
            {
                Run run = new Run(word);
                run.FontWeight = FontWeights.Bold;
                line.Inlines.Add(run);
            }
            else
            {
                line.Inlines.Add(word);
            }

            if (count++ != wordSplit.Length)
            {
                 line.Inlines.Add(" ");
            }
        }
     }

     tweetText.CaretPosition = tweetText.Document.ContentEnd.GetPositionAtOffset(-pos);
     tweetText.TextChanged += RichTextBox_TextChanged;
}
person James Sampica    schedule 07.08.2013
comment
Това предизвика необработено изключение в частта TextRange. Моля, имайте предвид, че това се използва в събитието richtextbox_textchanged и е написано в WPF - person Rhys Towey; 07.08.2013
comment
RichTextBox не поддържа .Document.Blocks.ToList() - person Rhys Towey; 07.08.2013
comment
Трябва... BlockCollection наследява от TextElementCollection, който наследява IEnumerable‹T›. Сигурни ли сте, че сте в WPF и използвате System.Windows.Controls.RichTextBox, а не System.Windows.Forms.RichTextBox? - person James Sampica; 07.08.2013
comment
ToList е метод за разширение от LINQ. Уверете се, че имате using System.Linq;. - person Abe Heidebrecht; 12.08.2013
comment
Благодаря Абе. Въпреки това, когато стартирате кода, текстът се смесва (пренебрегва интервала) и текстовият курсор винаги е в началото на текста. Някакви идеи? - person Rhys Towey; 12.08.2013
comment
Проблемът с игнорирането на интервала идва от разделянето, трябва да добавите отново интервали преди затварящата скоба на цикъла foreach (който може да се наложи да замените с обикновен цикъл for, за да добавите интервали само между думите). За проблема с курсора трябва да запазите позицията на курсора преди процеса и да го заредите след това. Може да погледнете RichTextBox.CaretPosition или RichTextBox.Selection... (но успех с това!) - person franssu; 13.08.2013
comment
@Rhys Актуализира отговора, за да включва интервали. Къде трябва да се позиционира каретката? - person James Sampica; 14.08.2013
comment
Благодаря Джим. Е, в момента се пише отдясно наляво вместо стандартното отляво надясно. Бихте ли могли да го накарате да пише отляво надясно - person Rhys Towey; 14.08.2013
comment
Едно последно нещо, Джим, ако щракна в средата на изречение, за да променя нещо, това ще премести каретката в края на реда. Може би бихте могли да го накарате да запомни текущата позиция на каретката и просто да го премести на една позиция? - person Rhys Towey; 14.08.2013

Не знам точните ви изисквания, но ви препоръчвам да не използвате RichtextBox за целите на подчертаването на синтаксиса. Има отличен компонент, наречен AvalonEdit, който лесно може да се използва за това. Можете да прочетете повече за AvalonEdit в тази статия: http://www.codeproject.com/Articles/42490/Using-AvalonEdit-WPF-Text-Editor

Дефиниция на синтаксис за вашите изисквания:

<SyntaxDefinition name="customSyntax"
        xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
    <Color name="User" foreground="Blue" fontWeight="bold" />

    <RuleSet>
        <Span color="User" begin="@" end =" "/>
    </RuleSet>
</SyntaxDefinition>

въведете описание на изображението тук

Пълният демо-проект може да бъде изтеглен тук: http://oberaffig.ch/stackoverflow/avalonEdit.zip

person doerig    schedule 13.08.2013