2016-02-25 4 views
1

У меня есть RichTextBox, и я пытаюсь найти и выделить все слова, соответствующие запросу, предоставленному пользователем. В коде у меня есть работы, но для довольно больших документов он зависает от пользовательского интерфейса, поскольку все делается в потоке пользовательского интерфейса.Как получить доступ к элементам управления WPF из фонового потока

List<TextRange> getAllMatchingRanges(String query) 
    { 
     TextRange searchRange = new TextRange(ricthBox.Document.ContentStart, ricthBox.Document.ContentEnd); 
     int offset = 0, startIndex = 0; 
     List<TextRange> final = new List<TextRange>(); 
     TextRange result = null; 

     while (startIndex <= searchRange.Text.LastIndexOf(query)) 
     { 
      offset = searchRange.Text.IndexOf(query, startIndex); 

      if (offset < 0) 
       break; 
      } 

      for (TextPointer start = searchRange.Start.GetPositionAtOffset(offset); start != searchRange.End; start = start.GetPositionAtOffset(1)) 
      { 
       if (start.GetPositionAtOffset(query.Length) == null) 
        break; 
       result = new TextRange(start, start.GetPositionAtOffset(query.Length)); 
       if (result.Text == query) 
       { 
        break; 
       } 
      } 
      if (result == null) 
      { 
       break; 
      } 
      final.Add(result); 

      startIndex = offset + query.Length; 
     } 

     return final; 

    } 

Это возвращает список текстовых диапазонов, которые я могу затем выделить, но я не могу выполнить его на фоновом потоке, как он бросает исключение, так как я бы пытаюсь получить доступ к документу в RichTextBox на волоске, что Бесполезного Не создавайте его.

ответ

4

Один из вариантов: Dispatcher's background priority. Пусть подсветка произойдет в фоновом режиме, не блокируя поток пользовательского интерфейса.

Application.Current.Dispatcher.BeginInvoke(
    DispatcherPriority.Background, 
    new Action(() => {// Do your highlighting})); 
Смежные вопросы