2016-08-22 3 views
1

У меня есть RichTextBlock в моем проекте UWP, когда я устанавливаю длинную строку как контент, для отображения содержимого, как 3 секунды, требуется много времени. Я искал в Интернете и обнаружил, что у него нет virtualization, он хочет отобразить весь контент. Кажется, что проблема существует в WPF и RichTextBox.Медленная загрузка по RichTextBlock длинной строкой

Можете ли вы предложить мне, что мне делать, чтобы отображать только визуальный контент?

+0

Как долго ваша строка? Я тестировал с 12000 символьной строкой и мгновенно отображает нажатие кнопки. –

+0

Используйте визуальный студийный профилировщик, чтобы проверить, что занимает много времени. 3 секунды слишком длинны. Также проверьте, не имеет ли значение работать в режиме деблокирования вместо отладки. –

ответ

1

Я бы разделил содержимое по абзацам и визуализировал каждый из них отдельно в ListView.

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <RichTextBlock /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

У меня длинный абзац не кратный – Maryam

+0

@Maryam Возможно, у вас не должно быть одного очень длинного абзаца. – Paparazzi

+0

Я тестировал, и я добавил его как 36 000 + символов, и он по-прежнему отображается мгновенно .. в 42000 символьных строк он дал исключение .. Так что есть что-то еще, замедляющее код –

0

Включите длинную строку в список меньших строк List<string> strList. Всякий раз, когда ScollViewer достигает конца, загружается больше текста (в том же абзаце).

<ScrollViewer Name="Scroll" 
      ViewChanged="Scroll_OnViewChanged"> 
     <StackPanel> 
      <RichTextBlock> 
       <Paragraph x:Name ="P"></Paragraph> 
      </RichTextBlock> 
     </StackPanel> 
    </ScrollViewer> 

.

private void Scroll_OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
      { 
       var scroller = (ScrollViewer) sender; 

       if (scroller.ScrollableHeight-scroller.VerticalOffset > 5) return;  
       if (pointer >= strList.Count) return; 

       var run = new Run {Text = strList[pointer++]}; 

       P.Inlines.Add(run); 
      } 

pointer это просто частный класс поле типа int.

+0

, потому что у меня есть страница поиска, и, возможно, я хочу перейти на страницу, это медленнее. – Maryam

Смежные вопросы