Метод для поиска в RichTextBox и выделения всех экземпляров этого конкретного слова - PullRequest
1 голос
/ 07 января 2012

Я действительно не знаю, с чего начать с этого.

У меня есть приложение WPF, у которого есть RichTextBox, внутри которого есть загрузка текста с использованием FlowDocument, которая меняется в зависимости от выбора пользователя.

Мне нужен метод, с помощью которого пользователь может ввести слово в TextBox, и каждый экземпляр этого слова, если он найден, будет затем выделен в соседнем RichTextBox. http://kentb.blogspot.com/2009/06/search-and-highlight-text-in-arbitrary.html Эта идея была бы идеальной, но я не знаю, как применить ее к моему приложению с помощью RichTextBox.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 08 декабря 2012

Вы пытались использовать RegularExpressions?

Что-то вроде:

private void searchButton_Click(object sender, EventArgs e)
{
    //Select all text and bring it back to default color values so you
    //can make a new search selection

    richTextBox1.SelectAll();
    richTextBox1.SelectionColor = System.Drawing.Colors.Black;

    //Deselect all text to ready selections

    richTextBox1.DeselectAll();

    //Create a MatchList variable and initialize it to all matches
    //within the RichTextBox. Add a using statement of 
    //System.Text.RegularExpressions 

    Color evenColor = Color.Red;
    Color oddColor = Color.Blue;

    MatchCollection matches = Regex.Matches(richTextBox1.Text,  searchTextBox.Text);

    //Apply color to all matching text
    int matchCount = 0;
    foreach (Match match in matches)
    {
        richTextBox1.Select(match.Index, match.Length);
        //richTextBox1.SelectionColor = System.Drawing.Color.Red;
        richTextBox1.SelectionColor = 
            matchCount++ % 2 == 0 ? evenColor : oddColor;
    }
}

Пока вам не нужно несколько цветов в вашем боксе одновременно, этот метод работает.Я уверен, что с некоторой дополнительной логикой вы могли бы это включить.

edit: не работает в WPF.Ведение поста для WinForms.

0 голосов
/ 08 января 2012

Я делаю это с FlowDocument. В этом примере перечислены цвета с фоном этого цвета. Я использую FlowDocumentReader для отображения FlowDocument, но я думаю, что RichTextBox также будет отображать FlowDocument. Это может показаться немного сложным, но разметка фактического текста гораздо менее проблематична, чем выделение позиции, как мне пришлось вернуться с помощью Windows.Form RichTextBox. Это код, который я использовал, чтобы решить, какой цвет подсветки выглядел лучше всего.

docFlowDocument = new FlowDocument();           
System.Windows.Media.Brush defaultBrush = System.Windows.Media.Brushes.White;
docFlowDocument.Background = defaultBrush;
System.Windows.Media.Brush curBrush = defaultBrush;
Paragraph p = new Paragraph();
Run r = new Run();
r.Background = curBrush;
#region nullDocument
 if (String.IsNullOrEmpty(DocText))
 {
     r.Foreground = System.Windows.Media.Brushes.Red;
     r.Text = "No Text";
     p.Inlines.Add(r);
     docFlowDocument.Blocks.Add(p);


     List<string> colorNames = (from pc in typeof(Brushes).GetProperties()
                                    select pc.Name).ToList();
     //Debug.WriteLine(colorNames.Count.ToString());
     //Debug.WriteLine(colorNames[0]);

     Type brushesType = typeof(Brushes);
     System.Reflection.MemberInfo[] membersinfo = brushesType.GetMembers();
     System.Reflection.PropertyInfo[] properties = brushesType.GetProperties();

     for (int i = 0; i < properties.Length; i++)
     {
         r = new Run();
         r.Background = (Brush)properties[i].GetValue(null, null);
         r.Text = colorNames[i];
         p.Inlines.Add(r);
         p.Inlines.Add(new LineBreak());
     }
     docFlowDocument.Blocks.Add(p);
     docFlowDocumentFinishedLastRun = true;
     return docFlowDocument;
 }
#endregion // nullDocument
...