2010-04-13 72 views
0

我想写一个自定义控制,将显示一个家谱...所以我看着FamilyShow ....WPF编写自定义控制

因此,他们的控制继承FrameworkElement的,但随后的每一件事情变得超级复杂.. 。有没有简单的教程可以展示如何用孩子实现自定义的FrameworkElement等?

基本上我未能做到,这是什么,添加子控件,并告诉他们,并绘制得到子控件的坐标...

回答

1

你所寻找的是一个Panel:它已经暴露UIElementCollection类型的Children财产,因此,所有你需要做的就是添加了孩子,并覆盖两个方法:

的MeasureOverride计算期望的大小你的面板。你可以返回任何你喜欢的尺寸。要采取一切可用的空间,刚刚回归的约束:

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

ArrangeOverride计算每一个孩子作为一个矩形的位置。您可以轻松使用附加属性为每个孩子存储额外的数据。这可以是公开可见的数据,例如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,直接画线到DrawingContextOnRender总是在ArrangeOverride完成并且可以访问儿童的实际位置后调用。

对于详细的教程,我会Bing“WPF面板教程”或“WPF自定义面板教程”。这里是one that looked good

+0

非常感谢!如果我能,我会给你一个+5! – Peter 2010-04-15 21:38:56

1

当我建议在看using a HierarchicalDataTemplate。通常,有一种方法可以使用内置的控件和分层数据模板,而不是生成自定义控件。

鉴于您希望展示家谱,应该可以直接在标准的WPF控件中执行此操作。

+0

是的,我确实使用过树控件,但我从来没有设法在“父母”和“孩子”之间划线,我认为这将是一个很好的教训,可以学习如何编写自定义控件.. – Peter 2010-04-13 18:46:56

1

一个完全展开的TreeView控件可以用来显示一个家族树。约什史密斯有一些文章如何改变它的布局,以适应你的需要通常用于家族树的东西:http://www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx

如果你仍然想要学习如何开发自定义控件,自定义控件而不是家庭树控件。

+0

那么确定生病选择一些简单的事情,但我仍然需要有关放置我的孩子元素得到他们的大小和安置后的信息.. – Peter 2010-04-13 20:11:58