Какой лучший способ создания тысяч элементов управления в прокручиваемой области с использованием WPF - PullRequest
1 голос
/ 24 июня 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 24 июня 2009

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

Я дал похожий ответ на подобную проблему здесь: Сверхскоростная C # Custom Control

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

1 голос
/ 24 июня 2009

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

Как говорится ...

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...