Равномерно распределенные элементы scatterView, которые не перекрываются - PullRequest
0 голосов
/ 23 марта 2010

У меня есть приложение, которое создает переменное число ScatterviewItems в зависимости от того, какой теговый объект размещен на поверхности таблицы.

Элементы ScatterViewItem добавляются программно в ScatterView на основе информации, найденной в БД

Scatterview хорошо отображает эту информацию

Однако я бы хотел, чтобы они были

  1. равномерно распределены по столу и

  2. элементы не перекрываются

Есть идеи, как это сделать?

Ответы [ 3 ]

0 голосов
/ 23 марта 2010

Похоже, вам нужно обнаружение столкновений.

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

Решение - это то, что нужно делать, когда вы обнаружили столкновение. Google поможет вам найти множество алгоритмов для этого. Вот пара ссылок на обсуждения stackoverflow: WPF: обнаружение столкновений с повернутыми квадратами , Применение коэффициента реституции в методе разрешения коллизий , Лучший способ обнаружить коллизию между спрайтами? .

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

0 голосов
/ 20 апреля 2010

ScatterViewItem имеет свойства Center и Orientation, которые можно использовать для программного позиционирования элементов. Если вы знаете размер каждого элемента, вы сможете использовать эти свойства, чтобы расположить их так, как вам удобно. Подключившись к событию Loaded каждого и проверив ActualWidth / ActualHeight, вы можете получить размеры. Если вы можете использовать фиксированный начальный размер для всех ваших SVI, это еще проще.

Вы можете выложить их, рассчитав простую сетку (плюс некоторую случайность, чтобы она выглядела более естественной), или вы можете искать то, что называется «сило-ориентированным расположением», которое дает каждому объекту отталкивающую силу относительно его размер. Через некоторое время элементы естественным образом будут равномерно удалены друг от друга, хотя они могут все еще перекрываться, если им не хватает места. Я не видел пример этого в WPF, но см. Flare.prefused.org/demo (layout> force), что я имею в виду во Flash.

0 голосов
/ 23 марта 2010

UniformGrid?

Вы также можете создать свою собственную панель, наследуя от Panel. Вы найдете некоторые ценные сведения в серии инструкций Dr.WF ItemsControl: http://drwpf.com/blog/itemscontrol-a-to-z/

Это нужно прочитать, точка.

...