как на .NET ( желательно WPF ) быстро рисовать много текста
От: okon  
Дата: 19.06.20 20:29
Оценка:
Да есть уже какие-то контролы сторонние типа AvalonEdit, есть FlowDocument и пр.

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

Решение в лоб — брать канвас и на нем рисовать текст работает очень медленно особенно на больших экранах.
Можно ли достичь производительности редактора Visual Studio , IDEA и др.
Или такие вещи только на С++ делаются.

p.s. про кеширование в битмеп думал но это работает только если нет скроллинга.
Когда начинается скроллинг то приходится перерисовывать весь экран учитываем что скроллинг часто не плавный ( там можно перерисовать только новую часть )
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Отредактировано 19.06.2020 20:35 okon . Предыдущая версия .
Re: как на .NET ( желательно WPF ) быстро рисовать много текста
От: Слава  
Дата: 20.06.20 00:56
Оценка: 2 (1) +1
Здравствуйте, okon, Вы писали:

O>Да есть уже какие-то контролы сторонние типа AvalonEdit, есть FlowDocument и пр.

FlowDocument адски тормозит. Я делал печать в XPS и просмотрщик этого формата заметно задумывался при скроллинге. Может конечно я неправильно с форматом обращался, но по-моему, всё было сделано просто по руководству из книжки по WPF.

O>Например вы хотите сделать инструмент аналог Merge , т.е. где сравниваются два текстовых файла со своей логикой разметки, подстветки и UI для мержа внутри контролов.


Для своего аналога merge я бы сделал нечто вроде двух виртуальных списков слева и справа. Скорллинг бы замещал элементы в списке, но сам список был бы размером с окно, а не прокручивался внутри окна.
Re[2]: как на .NET ( желательно WPF ) быстро рисовать много
От: okon  
Дата: 07.07.20 13:07
Оценка:
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, okon, Вы писали:


O>>Да есть уже какие-то контролы сторонние типа AvalonEdit, есть FlowDocument и пр.

С>FlowDocument адски тормозит. Я делал печать в XPS и просмотрщик этого формата заметно задумывался при скроллинге. Может конечно я неправильно с форматом обращался, но по-моему, всё было сделано просто по руководству из книжки по WPF.

O>>Например вы хотите сделать инструмент аналог Merge , т.е. где сравниваются два текстовых файла со своей логикой разметки, подстветки и UI для мержа внутри контролов.


С>Для своего аналога merge я бы сделал нечто вроде двух виртуальных списков слева и справа. Скорллинг бы замещал элементы в списке, но сам список был бы размером с окно, а не прокручивался внутри окна.


Возможно я не совсем понял идею — но зачем замещать элементы — чем это будет отличаться от рисования на 1 элементе который называется экран. или панель справа, панель слева.
Т.е. условно


алгоритм А

заливаем область панели цветом фона 
для каждой строки
   рисуем текст строки


Алгоритм Б

разбиваем панель на строки
для каждой строки
    заливаем область строки цветом фона
    рисуем текст строки



по мне это столько же текста придется рисовать — т.е. рисовать текст на весь экран.
поможет копирование и переиспользование элемента при скроллинге ( без повторного рисования текста ), но это поможет только при плавном построчном скроллинге,
если будет что-то типа PageUp/Down когда ранее отрисованные строки будут всегда не актуальны то придется перерисовывать весь экран.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Отредактировано 07.07.2020 13:13 okon . Предыдущая версия .
Re: как на .NET ( желательно WPF ) быстро рисовать много текста
От: hi_octane Беларусь  
Дата: 07.07.20 22:07
Оценка: 4 (1)
O>Но бывают задачи не совсем стандартные когда нельзя воспользоваться подобными решениями и нужно делать свою логику.
O>Например вы хотите сделать инструмент аналог Merge , т.е. где сравниваются два текстовых файла со своей логикой разметки, подстветки и UI для мержа внутри контролов.
Есть всякие коммерческие редакторы кода для WPF, например Actipro Syntax Editor (я когда-то для него делал подсветку и автокомплит собственного DSL, а потом всякие выделения в тексте для отладчика). Можно постучаться к разным в техподдержку и спросить "а с вами merge ui сделать можно?". Скорее всего кто-то что-то да предложит, и это будет относительно лёгкий путь.

Если время есть а деньги жалко — то можно изучить с декомпилятором Microsoft.VisualStudio.Text.Editor.Implementation.WpfTextView, и там найти подсказки как они быстро текст рисуют (если конечно там не одни вызовы в native).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.