2009-09-11 5 views
18

В приложении WPF я хочу создать панель вывода «Найти файлы», в которой я могу передавать большое количество текста без перераспределения памяти в каждой строке, например, TextBox делать.WPF Multiline TextBox для большого содержимого

В WPF TextBox есть одно свойство Text, которое хранит непрерывную строку. Каждый раз, когда я хочу добавить контент, мне нужно сделать textBox.Text += "New Text", что плохо.

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

Я думал об использовании стандарта ListBox с VirtualizingStackPanel, но он не позволяет выбирать текст по строкам.

(В каждой новой строки добавляется, я хочу контроль, чтобы обновить)

Любое предложение?

+0

Попробуйте использовать панель стека вместо окна списка –

+1

@Timothy - как бы это разрешить выбор текста по строкам? –

+4

Для людей, которые столкнулись с этим вопросом, потому что они обнаружили, что часто меняющееся (только в моем случае только чтение) текстовое поле имеет характеристики утечки памяти, обязательно установите UndoLimit для чего-то другого, кроме значения по умолчанию -1. Значение по умолчанию -1 для текстового поля позволит неограниченный рост истории отмены. – Derrick

ответ

17

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

Класс TextBox имеет метод AppendText(), который должен быть достаточно быстрым для вас.

Если вам нужна подсветка текста/форматирование, возможно, вы захотите использовать RichTextBox.

+1

С уважением, codymanix, в документе MSDN: Метод AppendText позволяет пользователю добавлять текст в содержимое текстового элемента управления без использования конкатенации текста, что может обеспечить лучшую производительность, если требуется много конкатенаций. Также, глядя на реализацию внутри .NET Reflector, AppendText - именно то, что мне нужно. – decasteljau

+2

Проблема с этим решением. :(TextBox берет слишком много ресурсов пользовательского интерфейса (ЦП) при наводнении элемента управления тысячами строк. TextBox не является виртуальным и выполняет сложные вычисления при каждом вызове AppentText(). Думаю, нам нужен элемент управления, который делает его перерисовкой & layout в виртуальном режиме, так как ItemsControl будет делать. – decasteljau

+10

Имейте в виду, что текстовое поле может хранить каждое из ваших приложений для отмены операций. Возможно, вы захотите изменить поле UndoLimit в текстовом поле. – Kelly

0

Вы рассмотрели или попробовали контроль RichTextBox?

+0

Мы попытались, но производительность стала катастрофической, вероятно, из-за переполнения, связанного со строковым форматированием, которое мне не нужно. – decasteljau

+0

Спасибо, что сообщили мне. Ответ @ codymanix звучит идеально - я этого не знал. –

-1

StringBuilder, просто добавить текст в строку строителя и вместо того, чтобы делать

textBox.Text += moreText; 

сделать

myStringBuilder.Append(moreText); 
textBox.Text = myStringBuilder.ToString(); 

Это должно заботиться о алгоритме Schlemiel the Painter's.

Конечно, строитель строк должен быть членом вашего класса, чтобы он существовал в течение жизни вашего объекта.

+0

каждый раз, когда вы вызываете ToString() в StringBuilder, он выделяет новую непрерывную строку, содержащую конкатенированные строки. Поскольку я буду добавлять новые строки в элемент управления все время, я точно этого не хочу. Для каждой новой строки я хочу, чтобы элемент управления обновлялся. – decasteljau

5

Если у вас действительно большой контент, то, к сожалению, все текстовые поля WPF и подобные элементы управления очень медленные. См. this question. Вы можете использовать AvalonEdit в качестве замены.