none
Обработка большого числа UIControl в Canvas WPF RRS feed

  • Вопрос

  • Добрый день. Я разрабатываю график биржевых котировок, и использую для этого WPF Canvas в качестве основной области построения графика, а для элемента бара использую Canvas и Border.

    Таких элементов в главном (Main Canvas) обычно более 2000. В сумме получается 2000 Canvas и 2000 Border = 4000 UI элементов в Main Canvas. 

    Вопрос в следующем: при попытке сделать масштабирование, замечена очень медленная операция - изменение размера элементов бара - Canvas и Border. При этом, изменяется только видимая часть элементов, а не все 4000. Изменение положения элементов методом Canvas.SetTop/SetLeft на производительности никак не сказывается, а изменение размеров отнимает существенное время, несмотря на то, что изменяются только видимые элементы. Если в Main Canvas добавить гораздо меньше элементов (например 1000 в сумме) - то видимая часть графика масштабируется в 4 раза быстрее, хотя по сути изменяется точно такое же количество элементов, как и в случае с 4000 элементами.

    Измерял StopWatch классом время выполнения операции - показывает моментально (11мс) на 4000 элементов, но почему то процесс рендеринга/перерисовки отнимает 3-4 секунды, что очень много.

    Подскажите пожалуйста, если сталкивались с подобными задачами - в каком направлении лучше двигаться. Спасибо.

    28 декабря 2012 г. 11:25

Ответы

  • Для графиков мы используем DynamicDataDisplay - бесплатный и отлично и быстро рисует. Правда немного неудобно использовать, но это мелочи жизни.

    Если же не хочется использовать графики сторонние, попробуйте использовать не бордер, а например Rectangle или другие какие элементы из System.Windows.Shapes

    • Предложено в качестве ответа Abolmasov Dmitry 10 января 2013 г. 6:45
    • Помечено в качестве ответа Abolmasov Dmitry 11 января 2013 г. 11:33
    9 января 2013 г. 10:32
    Отвечающий

Все ответы

  • Изменение масштаба происходит в цикле в основном потоке приложения, путем перебора массива с элементами.
    28 декабря 2012 г. 11:32
  • Уважаемый пользователь!

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме


    Для связи [mail]

    9 января 2013 г. 5:57
  • В вашей теме отсутствует активность в течение последних 5 дней.
    Надо поправку на НГ делать :)
    9 января 2013 г. 6:56
  • Для графиков мы используем DynamicDataDisplay - бесплатный и отлично и быстро рисует. Правда немного неудобно использовать, но это мелочи жизни.

    Если же не хочется использовать графики сторонние, попробуйте использовать не бордер, а например Rectangle или другие какие элементы из System.Windows.Shapes

    • Предложено в качестве ответа Abolmasov Dmitry 10 января 2013 г. 6:45
    • Помечено в качестве ответа Abolmasov Dmitry 11 января 2013 г. 11:33
    9 января 2013 г. 10:32
    Отвечающий