【发布时间】:2010-04-13 18:39:33
【问题描述】:
我想写一个自定义控件来显示家谱...所以我查看了 FamilyShow....
所以他们的控件继承了 FrameworkElement,但随后每件事都变得超级复杂......有没有简单的教程展示如何实现自定义 FrameworkElement 和子元素等等?
基本上我做不到的是,添加子控件并显示它们,绘制时获取子控件的坐标...
【问题讨论】:
标签: wpf custom-controls
我想写一个自定义控件来显示家谱...所以我查看了 FamilyShow....
所以他们的控件继承了 FrameworkElement,但随后每件事都变得超级复杂......有没有简单的教程展示如何实现自定义 FrameworkElement 和子元素等等?
基本上我做不到的是,添加子控件并显示它们,绘制时获取子控件的坐标...
【问题讨论】:
标签: wpf custom-controls
您要查找的是Panel:它已经公开了UIElementCollection 类型的Children 属性,因此您需要做的就是添加孩子并覆盖两个方法:
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 面板教程”或“WPF 自定义面板教程”。这里是one that looked good。
【讨论】:
我建议查看using a HierarchicalDataTemplate。通常,有一种方法可以只使用带有分层数据模板的内置控件,而不是生成自定义控件。
鉴于您希望显示家谱,应该可以直接在标准 WPF 控件中执行此操作。
【讨论】:
完全展开的 TreeView 控件可用于显示家谱。 Josh Smith 有一些文章如何将其布局更改为家庭树常用的布局,您可以根据自己的需要进行调整:http://www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx
如果您仍想学习如何开发自定义控件,请首先选择比家族树控件更容易的自定义控件。
【讨论】: