У меня есть модель данных, которая представляет сегменты кривой, которая выглядит следующим образом:
огибающая кривая http://img710.imageshack.us/img710/9059/envelope.png
Полями являются координаты x и y опорных точек (красный) и значение наклона, представленное контрольными точками (зеленый). Чтобы пользователь мог редактировать кривую, я собираюсь использовать объекты Thumb для опорных и контрольных точек.
Поскольку я также хотел бы иметь возможность предоставлять пользователю интерфейс, в котором можно вводить координаты в текстовые поля, я думаю о реализации этого редактора кривых как элемента управления без внешнего вида. Проблема, с которой я сталкиваюсь, состоит в том, чтобы найти лучший способ упорядочить элементы. Несколько мыслей о том, что я могу сделать:
- Добавьте объекты представления модели данных в ItemsContainer с помощью настраиваемой ItemsPanel и DataTemplate, который создает одну опорную точку и одну контрольную точку для каждого объекта модели данных. Это приводит к переносу двух и двух точек в ContentPresenter, что затрудняет взаимодействие между пользовательской панелью и точками большого пальца.
- Используйте два разных объекта представления модели данных, один для опорных точек и один для контрольных точек, и DataTemplateSelector, чтобы выбрать правильный DataTemplate. Несмотря на то, что ContentPresenter все еще существует между элементом и панелью (возможно ли избежать этого?), Взаимодействие может быть проще, когда в ContentPresenter есть только один элемент.
- Ни в коем случае не используйте ItemsContainer, вместо этого добавляйте объекты Thumb непосредственно в визуальные и логические деревья пользовательской панели. Конечно, я теряю большую гибкость, когда дело доходит до внешнего вида объектов Thumb, когда они не указаны в шаблонах. Возможно, возможно дублировать эту функцию из ItemsContainer, чтобы у моего элемента управления могли быть отдельные шаблоны данных для якорной и контрольной точек. Затем объекты Thumb могут быть добавлены непосредственно на панель без ContentPresenters.
Какой самый разумный способ сделать это? Есть ли другие варианты, кроме тех, о которых я думал?