powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Торможение потокового документа
8 сообщений из 8, страница 1 из 1
WPF: Торможение потокового документа
    #39037801
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал примитивное окошко для вывода лога (текстовый лог, но строки могут быть разного цвета). Примерно так:

Код: xml
1.
2.
3.
        <ScrollViewer x:Name="scroller" HorizontalAlignment="Stretch">
          <Span x:Name="log"/>
        </ScrollViewer>

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public void AddMessage(string message, bool isError = false)
    {
      ........
      log.Inlines.Add(new Run(message) { Style = errStyle, Tag = errTag });
      log.Inlines.Add(new LineBreak());
      ........
    }

При 400 элементах лога уже начинает заметно подтормаживать, как добавление элементов, так и скроллирование самого лога. Неужели для потокового документа это уже достаточно тяжелое визуальное дерево? А как же тогда работают мощные потоковые документы, там же могут быть и тысячи примитивных элементов? Или я просто что-то плохо понимаю/что-то не так делаю?

Или же надо плюнуть и использовать какой-нибудь ListBox с виртуализацией?
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39037864
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProСделал примитивное окошко для вывода лога (текстовый лог, но строки могут быть разного цвета). Примерно так:

Код: xml
1.
2.
3.
        <ScrollViewer x:Name="scroller" HorizontalAlignment="Stretch">
          <Span x:Name="log"/>
        </ScrollViewer>

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public void AddMessage(string message, bool isError = false)
    {
      ........
      log.Inlines.Add(new Run(message) { Style = errStyle, Tag = errTag });
      log.Inlines.Add(new LineBreak());
      ........
    }

При 400 элементах лога уже начинает заметно подтормаживать, как добавление элементов, так и скроллирование самого лога. Неужели для потокового документа это уже достаточно тяжелое визуальное дерево? А как же тогда работают мощные потоковые документы, там же могут быть и тысячи примитивных элементов? Или я просто что-то плохо понимаю/что-то не так делаю?

Или же надо плюнуть и использовать какой-нибудь ListBox с виртуализацией?
любая прокручиваемая область виртуализируются. Если это лог, логично разбить его на строки и выводить их в панели виртуализации VirualizationStackPanel через ItemsControl, если нужен другой подход, не ItemsControl, можно сделать свой Visual объект или даже Render.
В качестве строк может легко выступить TextBlock, у него есть свойство Inling для Span и прочего.
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39038000
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИли же надо плюнуть и использовать какой-нибудь ListBox с виртуализацией?Да, в WPF визуальное дерево очень прожорливое.
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39038003
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesShocker.ProСделал примитивное окошко для вывода лога (текстовый лог, но строки могут быть разного цвета). Примерно так:

Код: xml
1.
2.
3.
        <ScrollViewer x:Name="scroller" HorizontalAlignment="Stretch">
          <Span x:Name="log"/>
        </ScrollViewer>

Код: c#
1.
2.
3.
4.
5.
6.
7.
    public void AddMessage(string message, bool isError = false)
    {
      ........
      log.Inlines.Add(new Run(message) { Style = errStyle, Tag = errTag });
      log.Inlines.Add(new LineBreak());
      ........
    }

При 400 элементах лога уже начинает заметно подтормаживать, как добавление элементов, так и скроллирование самого лога. Неужели для потокового документа это уже достаточно тяжелое визуальное дерево? А как же тогда работают мощные потоковые документы, там же могут быть и тысячи примитивных элементов? Или я просто что-то плохо понимаю/что-то не так делаю?

Или же надо плюнуть и использовать какой-нибудь ListBox с виртуализацией?
любая прокручиваемая область виртуализируются. Если это лог, логично разбить его на строки и выводить их в панели виртуализации VirualizationStackPanel через ItemsControl, если нужен другой подход, не ItemsControl, можно сделать свой Visual объект или даже Render.
В качестве строк может легко выступить TextBlock, у него есть свойство Inling для Span и прочего.Может проще тогда сгенерировать HTML и показать его в WebBrowser?

:-)
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39038036
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМожет проще тогда сгенерировать HTML и показать его в WebBrowser?

:-)Лог заполняется в реальном времени и по умолчанию автопрокручивается. То есть пользователь при желании может сидеть и пялиться в лог. Так что подход с html наверно будет менее удобным.

Ок, попробую применить панель виртуализации.
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39113604
Smith27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КShocker.ProИли же надо плюнуть и использовать какой-нибудь ListBox с виртуализацией?Да, в WPF визуальное дерево очень прожорливое.
Где-то была инфа, что отображение кода в редакторе кода Студии (в 2010, чтоли) - это потоковый документ, где весь код - span'ы, run'ы и прочие элементы этого потокового документа. И как они умудрились?

А в 2012 - всё переписано на самописное, вроде. Вот визуальное дерево в Студии 2012 - пока добрался до отрисовки кода, задолбался в Snoop'е дерево раскрывать.



Какие-то рендеренные линии - каждая линия отдельно рендерится. Причём нумерация строк кода - тоже отдельный элемент. При такой охрененной вложенности элементов - удивляюсь, как у них ничего не тормозит в этой Студии.
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39115361
MrVoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я как-то пару лет назад задавал в MSDN вопрос - почему при добавлении String'ов в ListBox в визауальном дереве есть ListBoxItem, но свойствао SelectedItem возвращает String. Как видно из моего текста, самый быстрый способ - использовать ItemsSource. Тогда названия файлов быстро добавляются. Но тогда я получу String.
А чтобы получить ListBoxItem, я должен явно создавать ListBoxItem, но тогда прога начинает тормозить.
Вот в чём и бред - во всех трёх описанных мною способах добавления в визуальном дереве - ListBoxItem, но SelectedItem всё же возвращает разные результаты. :(
...
Рейтинг: 0 / 0
WPF: Торможение потокового документа
    #39115415
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Smith27,

дело в том, что сделать Visual объект в виде строки проще пареной репки, а по ресурсам это будет на много дешевле.
везде говорится, хотите производительности в WPF, переходите на Visual, с FrameworkElements.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Торможение потокового документа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]