WPF Написание пользовательских элементов управления - PullRequest
0 голосов
/ 13 апреля 2010

Я хотел написать пользовательский элемент управления, который бы отображал семейное дерево ... поэтому я посмотрел на FamilyShow ....

Таким образом, их элемент управления наследует FrameworkElement, но затем все становится очень сложным ... Существуют ли какие-либо простые учебники, которые показывают, как реализовать пользовательский FrameworkElement с дочерними элементами и т. Д.

По сути, я не могу сделать следующее: добавить дочерние элементы управления и показать их, а при рисовании получить координаты дочерних элементов управления ...

Ответы [ 3 ]

1 голос
/ 14 апреля 2010

Полностью расширенный элемент управления TreeView можно использовать для отображения семейного дерева. У Джоша Смита есть несколько статей о том, как изменить его макет на то, что обычно используется для семейного древа, которое вы можете адаптировать к вашим потребностям:

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

1 голос
/ 15 апреля 2010

То, что вы ищете, это Panel: оно уже предоставляет свойство Children типа UIElementCollection, поэтому все, что вам нужно сделать, это добавить дочерние элементы и переопределить два метода:

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

protected virtual Size MeasureOverride(Size availableSize)
{
  return availableSize;
}

ArrangeOverride вычисляет местоположение каждого дочернего элемента как Rect. Вы можете легко использовать вложенные свойства для хранения дополнительных данных для каждого дочернего элемента. Это могут быть общедоступные данные, такие как DockPanel.Dock или Canvas.Top, или это могут быть личные данные, которые вы используете, чтобы запомнить, где все происходит и почему. Скелет для ArrangeOverride:

protected virtual Size ArrangeOverride(Size finalSize)
{
  foreach(UIElement child in Children)
  {
    Rect childLocation = ... code to compute child location ...
    child.Arrange(childLocation);
  }
  return finalSize;
}

Для рисования линий вы можете использовать дочерние элементы управления или просто переопределить OnRender и рисовать линии непосредственно в DrawingContext. OnRender всегда вызывается после завершения ArrangeOverride и имеет доступ к фактическим местоположениям детей.

Для подробных уроков я бы назвал «Учебник WPF Panel» или «Учебник WPF Custom Panel». Вот тот, который выглядел хорошо .

1 голос
/ 13 апреля 2010

Я бы рекомендовал посмотреть на , используя HierarchicalDataTemplate . Как правило, существует способ просто использовать встроенные элементы управления с иерархическим шаблоном данных вместо создания пользовательского элемента управления.

Учитывая ваше желание показать семейное древо, это должно быть возможно сделать прямо в стандартных элементах управления WPF.

...