Как мне обрабатывать / редактировать большое количество текста в WPF? - PullRequest
7 голосов
/ 30 апреля 2009

Каков будет хороший подход для отображения и редактирования большого количества неформатированного текста (как это делает notepade) с использованием WPF? Загрузка большой строки в TextBox делает пользовательский интерфейс невосприимчивым. Общая производительность почти не сопоставима с элементами управления TextBox предыдущих платформ Microsoft UI Frameworks.

Какие варианты у меня есть, чтобы решить эту проблему. Я не хочу блокировать поток пользовательского интерфейса, пока текстовый элемент управления загружает текст. Также мне может понадобиться какая-то «виртуализация», потому что не стоит загружать весь текст в элемент управления (я думаю, что 20 МБ текста создаст много глифов, даже если они не видны). Кажется, что TextBox даже больше не имеет метода AppenText (), поэтому у меня даже нет способа контролировать асинхронную загрузку текста.

Разве это не распространенная проблема? Кажется, что WPF не предоставляет ничего для этого из коробки. Почему это так?

Ответы [ 8 ]

3 голосов
/ 11 мая 2009

Я не уверен, поможет ли это, но вы пытались использовать FlowDocumentPageViewer и FlowDocumentReader ?

Он также имеет очень хорошую поддержку аннотаций и выглядит идеально для загрузки документов в текстовом формате.

2 голосов
/ 12 мая 2009

Проблема в том, что TextBox - это отдельный элемент контейнера. Элементы управления списками, такие как ListBox, очень хорошо виртуализируются благодаря переработке контейнеров. На самом деле нет ничего простого, что вы можете сделать, чтобы ускорить TextBox.

Но элемент управления TextBox имеет метод AppendText ():

        TextBox tb = new TextBox();
        tb.AppendText("Hello");

Так что да, вы можете использовать это для динамического добавления текста, как вы упомянули.

1 голос
/ 04 августа 2010

AvalonEdit, текстовый редактор в SharpDevelop, был полностью написан с нуля в WPF и оптимизирован для больших объемов текста. Он не поддерживает форматированный текст (хотя он поддерживает подсветку синтаксиса и другие интересные функции, такие как свертывание). Я думаю, что это может идеально соответствовать вашему счету.

Вот статья редактора, написанная разработчиком:

http://www.codeproject.com/KB/edit/AvalonEdit.aspx

1 голос
/ 12 мая 2009

Вы пробовали WPF RichTextBox ? Вам определенно захочется прочитать информацию FlowDocument, если вы пойдете этим путем.

1 голос
/ 07 мая 2009

Вы всегда можете смешивать и сочетать технологии: вы можете добавить WinForms TextBox на родительский WPF. Вы теряете такие вещи, как стилизация, непрозрачность, анимация, трансформации и т. Д., Но если все, что имеет значение, это редактирование текста, WinForms TextBox делает это просто отлично.

1 голос
/ 30 апреля 2009

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

0 голосов
/ 03 октября 2017

Вы можете использовать FlowDocument , но это не работает из коробки для привязки к Документу свойства FlowDocument в MVVM.

Другое решение использует FlowDocumentScrollViewer и связывается с его Document свойством.

(или вы даже можете использовать FlowDocumentReader и связать его Document , аналогично FlowDocumentScrollViewer . Это дает вам другой пользовательский интерфейс.)

Вид:

 <FlowDocumentScrollViewer Document="{Binding FlowDocument, Mode=OneWay}" />

ViewModel:

   FlowDocument fd = new FlowDocument();
        Paragraph p = new Paragraph();
        Run r = new Run();
        r.Text = "large text";
        p.Inlines.Add(r);
        fd.Blocks.Add(p);
        FlowDocument = fd;

 private FlowDocument _FlowDocument;
    public FlowDocument FlowDocument
    {
      get{ return _FlowDocument; }
      set
      {
        _FlowDocument = value;
        NotifyOfPropertyChange(nameof(FlowDocument));
      }
    }

см. Также дополнительные советы по производительности: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-text#flowdocument-textblock-and-label-controls

0 голосов
/ 07 мая 2009

Как насчет того, чтобы попробовать что-то вроде этого:

Сохраните всю строку в памяти, но покажите только ее часть в текстовом поле. Размер этой нарезанной строки будет рассчитываться динамически в зависимости от размера текстового поля, размера шрифта и т. Д.

Конечно, это требует много нетривиального кода для правильного отображения, синхронизации и т. Д., Но кажется, что это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...