написание сетки, в которой есть виртуализация столбцов и строк - PullRequest
2 голосов
/ 16 сентября 2011

Мне нужно написать сетку, подобную Excel, в которой может быть много ячеек (400x400). Все столбцы имеют одинаковую ширину, а все строки одинаковой высоты. Каждая ячейка может содержать текст или быть пустой, а каждая ячейка может иметь столбец и / или строку span. Я полагаю, что это никогда не будет работать с панелью Grid , и я полагаю, что мне потребуется виртуализация пользовательского интерфейса в направлении столбцов и строк.

Итак, моей первой попыткой было создать виртуализирующую сетку на основе VirtualizingPanel и реализовать IScrollInfo . Это могло бы быть "легко" решением, за исключением того, что я столкнулся с проблемой:

Чтобы предоставить IScrollInfo соответствующую информацию о размере и положении прокрутки и чтобы можно было определить, какие элементы необходимо создать (реализовать) в следующем порядке с помощью ItemsContainerGenerator, мне нужно знать индекс столбца, значение Indeox строки и число столбцов для каждый дочерний элемент (ячейка). Единственный способ сделать это - использовать свойства attach. Проблема в том, что я могу читать значения вложенных свойств, только если уже имеется реализованный ItemContainer. Так что я в защелке 22 здесь. Чтобы знать, что реализовать, мне нужно реализовать все предметы. Чтобы предоставить данные для IScrollInfo мне нужно реализовать все пункты.

Так что, похоже, я зашел в тупик с этим подходом.

Есть ли у вас какие-либо идеи, как я мог бы реализовать такой элемент управления, или знаете, как я мог бы решить вышеупомянутую проблему?

1 Ответ

0 голосов
/ 19 сентября 2011

Мне кажется, что вам, возможно, не нужно создавать экземпляры самих элементов пользовательского интерфейса - вы можете очень легко получить коллекцию производных от DependencyObject ViewModel, каждая из которых имеет набор WidthProperty и HeightProperty (и, возможно, связана с эквивалентными Width и Height свойства видимого элемента пользовательского интерфейса ячейки после их создания).

Хранение 160 000 (400x400) экземпляров классов не должно быть проблемой, особенно если вы можете проиндексировать набор, используя строки и столбцы.

...