Мне нужен совет о том, как разработать / внедрить эту пользовательскую панель - PullRequest
0 голосов
/ 08 ноября 2011

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

Чтобы создать макет, после запуска Loaded я делаю следующее:

1) Read how many children it has and create the appropiate number of rows/colums.
2) Position every existing children in the corresponding row/colum.
3) Create, position and add a GridSplitter for every child.

Этот подход выглядит и работает отлично, но он открывает двери для многих проблем:

  • Поскольку для каждого ребенка добавлен GridSplitter, число ожидаемых детей удваивается. Если кто-то добавит к нему 3 элемента, Children.Count вернет 6.

  • Пользователь может вставлять / удалять вещи не в том месте.

  • Это просто выдает исключение, когда эта Сетка используется в качестве ItemsPanel для ItemsControl, так как в этом случае WPF (не Silverlight) не разрешает прямую дочернюю манипуляцию.

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

Как выясняется, этот класс следует рассматривать как «детали реализации», поэтому реальный вопрос в том, какой контроль я должен поставить перед пользователем?

Похоже, это должна быть Panel, но я не могу управлять свойством Children, так как оно не виртуальное, и есть также ItemsControl, который, я думаю, мог бы быть хорошим кандидатом, но я действительно не знаю.

Я был бы очень признателен за любые советы или указания, как сделать это правильно.

Заранее спасибо.

1 Ответ

1 голос
/ 08 ноября 2011

Видите ли, используя только сетку, вы оставляете себе обязательный способ добавления только элементов.Как и в myCustomGrid1.AddMyItem (***), гриды просто не имеют свойства ItemsSource.ItemsControls делают - поэтому, если вам нужна поддержка источников декларативных элементов, т.е. myControl.ItemsSource = {Binding ...}, вы собираетесь получить ваш элемент управления из ItemsControl.Это не две линии - сделать запись на ItemsPanel Children - это большой вызов - простого способа сделать это не существует.

Это небольшая вещь, которую упустили из виду при разработке Grid - сплиттеры не должны были добавляться в коллекцию Children, поскольку Children - это визуализация ваших BO, в то время как spliiters - это просто элементы форматирования.

Вот что я хотел бы сделать.

  1. Забудьте о ItemsSource и элементах в целом - это не проблема.Единственный способ добавить / удалить элементы в вашем элементе управления будет AddResiazableItem / RemoveResizbleItem.Вызовы добавят элементы и разделитель (для средних элементов), увеличат количество строк / столбцов вашей сетки в зависимости от ее ориентации, установят свойства Grid.Row / Grid.Column для ваших визуальных дочерних элементов.Вы можете сохранить ваши фактические объекты внутренне для поддержки изменения ориентации.

  2. Если на любом этапе вы захотите связать свой элемент управления с источником IEnumerable - просто создайте прикрепленное поведение, которое будет повторятьсяэлементы и вызов AddResiazableItem в цикле.

Приветствия.

PS Модераторам - редактор, кажется, сломался, ребята.Я не вижу второй предмет.PSS Исправлено после нескольких попыток.

...