Какой лучший способ создания тысяч элементов управления в прокручиваемой области с использованием WPF

Я использую WPF и C#.

У меня проблема. Мне нужно создать много привязываемых шаблонных элементов управления в прокручиваемой области (все они разных типов). Например, 1000 текстовых полей, 1000 раскрывающихся списков и 1000 флажков.

Проблема в том, что когда они все созданы, это работает очень медленно.

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

PS Я много чего пробовал (рендеринг только геометрии, разные базовые классы и т. Д.), Но в настоящее время единственный подход, который мне кажется работающим (я еще не пробовал), - это создавать только те элементы управления, которые вписываются в текущий видовой экран и обновить этот список элементов управления при прокрутке.

PPS Я знаю, что в 3.5 SP1 есть механизм, который используется в ListBox, когда элементы списка используются повторно во время прокрутки, но такой подход не может быть использован здесь, потому что все эти элементы имеют разные типы.

Большое спасибо.

2 ответа

Тот факт, что вам нужно ~3000 элементов управления на одном экране, является проблемой, и обычно это признак того, что вы приближаетесь к графическому интерфейсу с неправильной точки зрения. Я не очень разбираюсь в WPF, но мои знания WinForms говорят мне, что более 1000 экземпляров элементов управления просто создают проблемы. Это то, для чего были разработаны ListBoxes, DataGrids и другие элементы управления форматами таблиц / списков.

Я дал аналогичный ответ на подобную проблему здесь: Super Slow C# Custom Control

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

Во-первых, я бы поставил под сомнение обоснованность такого типа требований. Наличие тысяч элементов управления во всем, кроме какой-либо сетки или списка (где они все постоянны, не меняются, поэтому подход в стиле списка будет работать нормально), будет невероятно запутанным для вашего пользователя. По сути, вы заставляете неочевидный, меняющийся интерфейс с тысячами предметов.

Что, как говорится...

PPS Я знаю, что в 3.5 SP1 есть механизм, который используется в ListBox, когда элементы списка используются повторно во время прокрутки, но такой подход не может быть использован здесь, потому что все эти элементы имеют разные типы.

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

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

Другие вопросы по тегам