Я пытаюсь создать представление в WPF и с трудом понимаю, как его настроить. Вот что я пытаюсь построить:
- Моя ViewModel предоставляет свойство IEnumerable, называемое Items
- Каждый элемент представляет собой событие на временной шкале, и каждый из них реализует ITimelineItem.
- ViewModel для каждого элемента имеет собственный DataTemplate для его отображения.
- Я хочу отобразить все элементы на временной шкале, соединенные линией. Я думаю, что для этого хорошо подойдет WrapPanel внутри ListView.
- Однако высота каждого элемента будет варьироваться в зависимости от отображаемой информации. Некоторые элементы будут иметь графические объекты прямо на линии (например, круг, ромб или что-то еще), а некоторые имеют аннотации над или под линией.
Так что мне это кажется сложным. Кажется, что каждый элемент на временной шкале должен отображать свой собственный сегмент линии. Хорошо. Но расстояние между верхней частью элемента и линией (и нижней частью элемента в строке) может варьироваться. Если один элемент имеет линию на 50 пикселей вниз от верха, а следующий элемент имеет линию на 100 пикселей вниз от верха, то первому элементу требуется отступ в 50 пикселей, чтобы сегменты линий складывались.
Я думаю, что мог бы решить эту проблему, однако нам нужно добавить отступ только в том случае, если эти два элемента находятся в одной строке в WrapPanel! Допустим, есть 5 элементов, а на экране есть место только для 3-х... WrapPanel поместит два других на следующую строку. Это нормально, но это означает, что только первые 3 должны сочетаться друг с другом, а последние 2 должны сочетаться друг с другом.
Вот от чего у меня болит голова. Есть ли другой подход, на который я мог бы посмотреть?
EDIT: я склоняюсь к замене WrapPanel пользовательской панелью, которая наследуется от Canvas и переопределяет методы MeasureOverride и ArrangeOverride.