![]() |
Модераторы: gambit, Kefir, Partizan |
![]() ![]() ![]() |
|
ivanfain |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
Я вот думал, WPF несказанно крут, DirectX и всякой такое. Но реально я хочу разместить несколько тысяч ячеек и это занимает несколько секунд. Ячейка - это просто UserControl, на Canvas. UserControl не сложный, текстовое поле TextBlock и Border. Результат должен быть на подобии листа Excel. Но вот всё это не реально долго. Как оптимизировать? Реально ли сделать отрисовку нескольких тысяч ячеек меньш секунды. Excel ведь это умеет, да и не на WPF он написан.
Спасибо. |
|||
|
||||
Stas123 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.11.2009 Репутация: нет Всего: нет |
Подумайте, может стоит использовать паттерн "Приспособленец"(Flyweight).
|
|||
|
||||
ivanfain |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
А как его использовать? Каждая ячейка имеет уникальные координаты, поэтому трудно обойтись одним объектом.
|
|||
|
||||
exBlender |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 2.10.2009 Репутация: 9 Всего: 9 |
А для чего каждой ячейке иметь уникальные координаты и быть посаженной на Canvas, eсли все это должно быть похожим на таблицу? Почему не использовать DataGrid или, хотя бы, просто Grid? --------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт. |
|||
|
||||
ivanfain |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
||||
|
||||
SergeyLoginov |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 28.9.2009 Где: Иваново Репутация: 4 Всего: 4 |
WPF очень медленно отрисовывает большое количество визуальных элементов. Но в Вашем случае можно использовать виртуализацию данных. В частности, существует виртуализированный Canvas, в котором рендерятся только видимые на экране элементы. В DataGrid, кстати, тоже реализована виртуализация.
|
|||
|
||||
erm0l0v |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 11.1.2011 Репутация: нет Всего: 1 |
Используйте DataGrid. Canvas не для этого предназначен.
И как вам вообще пришла в голову мысль использовать Canvas? Элементы ведь можно по координатам размещать и в Grid. В общем попробуйте реализовать задачу с использованием DataGrid. Это будет самый оптимальный способ. В крайнем случае через Grid. |
|||
|
||||
ivanfain |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
Спасибо, но это контрол я знаю DataGrid не подойдёт. Мне нужны головы таблицы со всех сторон. Переделал на Grid, так как Canvas потом использовать не удобно. Но при переходе на Grid производительность ещё снизилась. Что же делать? |
|||
|
||||
erm0l0v |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 11.1.2011 Репутация: нет Всего: 1 |
Я такого не делал но уверен почти на 100 процентов что это возможно сделать по средствам стилей. В WPF стилями можно изменить вообще все. По поводу что делать поставьте профайлер памяти и вы сможете увидеть какие классы занимают больше всего места. На первый взгляд копать нужно в сторону большого количества UserControl. Кроме того возможно неправильно настроен ScrollViewer. Возможно в приложении ошибка которую вы не ведите из-за пустого catch. И все таки ради теста попробуйте отобразить данные в DataGrid если будет работать так же долго то проблема не в визуальном отображении. У меня таблица из 100к строк и примерно 15 столбцов строится очень быстро, меньше секунды и учетом того что данные еще тянутся из базы и некоторые поля таблицы вычисляются. |
|||
|
||||
ivanfain |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
Дело не в памяти, а в процессорном времени
Там и теряется перформанс.
Если вы покажете как переопределить стиль DataGrid чтобы он выглядел так, как это показано на изображении. С возможность в добавлять и убирать головы(как сверху так и слева), а следоватьльно и менять количество ячеек, буду вам очень признателен. Если же это просто разговоры - тогда плохо. ![]() Это сообщение отредактировал(а) ivanfain - 22.3.2012, 09:49 |
||||||
|
|||||||
erm0l0v |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 11.1.2011 Репутация: нет Всего: 1 |
Теперь понятно почему вы решили использовать Canvas))
Только может быть Canvas работал бы быстрее если вы не добавляли контролы а рисовали таблицу примитивами, но это конечно жестоко. По поводу DataGrid для отображения заголовков в левой части можно использовать группировки, но правда меня разочаровала скорость работы группировки в DataGrid в WPF особенно по сравнению с Silverlight. По поводу группировки заголовков сверху и объединенных ячеек справа я пока ничего не могу придумать((( если что нибудь придет на ум отпишусь... Вроде есть компоненты для отображения таблиц Excel в WPF (я нашел только платные) и есть компоненты в Windows Forms вы принципе можете использовать компоненты из WF в WPF но опять же скорость работы WinFormsHost меня разочаровала. |
|||
|
||||
ivanfain |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
Теперь перешёл на Grid, потому как Canvas не адекватно отрисовывается. Для него почему-то не работает нормально SxrolViwer. Портировать на Grid было делом 15 минут. Меня смущает то, что я добавляю элементы в коллекцию в цикле
Может как-то нужно остановить отрисовку прежде чем начать добавлять? Но боюсь WPF это и так делает. Скорее всего он останавливает отрисовку пока не будут добавлены все элементы. |
|||
|
||||
erm0l0v |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 11.1.2011 Репутация: нет Всего: 1 |
Сейчас для теста вывел таблицу 10000 на 5 ждал 10 секунд.
По идеи
должна остановить отрисовку, но в моем примере это не помогло (или помогло но незначительно). |
|||
|
||||
exBlender |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 2.10.2009 Репутация: 9 Всего: 9 |
А зачем там вообще UserControl-ы? С такой графикой можно просто назначать Background для TextBlock-ов.
Это сообщение отредактировал(а) exBlender - 23.3.2012, 22:22 --------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт. |
|||
|
||||
ivanfain |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 17.3.2012 Репутация: нет Всего: нет |
Там логика в UserControl-ах содержится. Её конечно можно вынести отдельно, но будет ли профит? Хотя бы 10% производительности получу? Сомневаюсь.
|
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | WPF и Silverlight | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |