#c# #wpf-controls
#c# #wpf-элементы управления
Вопрос:
Какой элемент управления лучше всего использовать в приложении wpf для загрузки больших текстовых файлов? И это не так просто, мне нужно иметь возможность подсветить / изменить фон / цвет некоторых строк. Я думал об использовании RichTextBox .. но хотя я просто прихожу и спрашиваю, что думают другие люди.
Мне не нужно редактировать текст, просто выделите строки с ошибками
РЕДАКТИРОВАТЬ: Ах, я забыл упомянуть, содержимое текстового файла обрабатывается программой, которая изменит цвет фона некоторых строк. Было бы неплохо предоставить пользователю возможность изменить все это, когда программе не удается найти некоторые строки ошибок.
ПРАВКА 2: Приложение предназначено для синтаксического анализа файлов журналов, поэтому файлы могут быть большими, более 50 000 строк..
Комментарии:
1. RichTextBox имеет готовые функциональные возможности для ваших требований. Но его производительность довольно низкая, когда вы стилизуете файл размером более 5 Мб. У него нет встроенного виртуального режима. Вероятно, вы можете расширить это для себя. Если вы собираетесь его использовать, сначала убедитесь, что вы довольны его производительностью. Я не уверен, что какой-либо элемент управления .net можно рекомендовать для обработки больших текстовых файлов с помощью стиля.
2. Да, вы совершенно правы, у меня здесь есть файл размером 1 МБ для тестирования, и загрузка в RichTextBox занимает слишком много времени. Какие другие решения можно использовать, чтобы ускорить его?
3. Какой максимальный размер файла вы хотите там использовать? Я не уверен, можно ли его оптимизировать для использования больших текстовых файлов. Отключите его нежелательные функции, такие как проверка орфографии, и посмотрите.
4. DocumentViewer также является подходящим элементом управления для вас. Я никогда им не пользовался, попробуйте и посмотрите. Если нет, я думаю, вам нужно найти любой другой сторонний элемент управления для этого (насколько я знаю).
5. Как насчет этого: textpad.com/support/faq/csharp.html
Ответ №1:
Я не понял, хотите ли вы только отображать файлы или разрешить пользователю редактировать их.
В любом случае, возможно, ScintillaNET был бы вам полезен.
Хорошо известный текстовый редактор Notepad использует Scintilla 🙂
Вы могли бы использовать исходные тексты notepad в http://sourceforge.net/projects/notepad-plus / , но он написан на c , поэтому API будет немного отличаться от .NET.
Редактировать
Notepad способен отображать файлы размером около 100-200 МБ. Если вам нужно что-то получше этого, вам нужно было бы реализовать какую-то технологию подкачки / виртуальный режим (не загружайте весь файл, только ту часть, которая будет отображаться на экране в зависимости от текущего положения полосы прокрутки)
Если Scintilla кажется излишеством, то, возможно, вам было бы лучше просто создать DataGrid. Если записи журнала состоят из нескольких полей, они могут стать столбцами, и их будет еще проще читать. Если вы хотите пойти по этому пути, сначала проанализируйте свой файл журнала в виде списка LogEntry, затем используйте databinding для привязки к нему. Вы могли бы читать свой файл постепенно по мере добавления новых строк для улучшения пользовательского опыта.
Комментарии:
1. На самом деле мне не нужно их редактировать, просто хочу отобразить их с несколькими выделенными строками.
2. Я только что заглянул в элемент управления ScintillaNET codeplex. Звучит действительно хорошо. Я думаю, что это стоит попробовать.
3. На самом деле, это должно работать в VS2010: scintillanet.codeplex.com/wikipage?title=Installation . Однако это элемент управления WinForms, поэтому вам пришлось бы поместить его в WindowsFormsHost, как в switchonthecode.com/tutorials /…
4. @hs2d Я видел, как люди предлагали AvalonEdit вместо ScintillaNET (сам им не пользовался). Это чистый WPF и используется в SharpDevelop. wiki.sharpdevelop.net/AvalonEdit.ashx
5. @surfen, спасибо. Тестирую AvalonEdit прямо сейчас. Мгновенно загружает мой файл размером 1 МБ. Теперь просто нужно посмотреть, соответствует ли это другим моим потребностям. (:
Ответ №2:
Я думаю, RichTextBox
в этом случае будет наиболее подходящим, но, как сказал CharithJ, вы не можете загрузить в него весь вход за один раз, это слишком сильно ударит по производительности.
Что бы я сделал в подобном сценарии, так это.. У меня будет Richtextbox
вместе с двумя маленькими кнопками вверх и вниз для прокрутки. Я буду загружать только некоторый текст журнала за один раз, скажем, x количество символов. Как только пользователь нажимает кнопку прокрутки вверх или вниз, я бы удалил некоторый текст из начала и конца в зависимости от того, какую кнопку пользователь нажал, вверх или вниз, и на основе этого я бы удалил некоторый текст из richbox и добавил какой-то другой.
Либо вы можете сделать что-то вроде того, что я предложил выше, либо другим способом может быть расширение RichTextBox
элемента управления и реализация логики, которая одновременно пересылает для отображения только ограниченный текст RichTextBox
. Вы можете обрабатывать события, связанные со прокруткой, чтобы вносить изменения в содержимое RichTextBox.
Комментарии:
1. Да, это правда. Это единственный способ сделать это быстрее. Но это может сделать вашу логику выделения текста довольно сложной, и реализовать это не совсем просто (по крайней мере, для меня).