2010-04-13 3 views
0

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

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

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

ответ

1

Что вы ищете является 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 и имеет доступ к фактическим местоположениям детей.

Для получения подробных руководств я бы использовал Bing "WPF Panel Tutorial" или "WPF Custom Panel Tutorial". Вот one that looked good.

+0

спасибо большое! если бы я мог дать вам +5! – Peter

1

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

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

+0

Да, я изучал использование элемента управления деревом, но мне никогда не удавалось получить линии между «родителями» и «ребенком» в любом случае, я думаю, что это хороший урок, чтобы научиться писать пользовательские элементы управления. – Peter

1

Полностью расширенный элемент управления TreeView может использоваться для отображения генеалогического древа. Джош Смит имеет некоторые статьи о том, как изменить свой макет на то, что обычно используется для генеалогического древа, которое вы можете приспособить к вашим потребностям: http://www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx

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

+0

Ну, конечно, плохо подберите что-нибудь просто, но мне все равно понадобится информация о том, как потом мои дочерние элементы получат свой размер и место. – Peter

Смежные вопросы