[英]WPF Writing custom Control
我想写一个自定义控件来显示一棵家谱...所以我看了FamilyShow...。
因此,他们的控件继承了FrameworkElement,但是每件事都变得非常复杂...是否有任何简单的教程来展示如何使用子对象实现自定义FrameworkElement等等?
基本上我做不到的是,添加子控件并显示它们,以及在绘制时获取子控件的坐标...
我建议看一下使用HierarchicalDataTemplate 。 通常,有一种方法可以只使用带有分层数据模板的内置控件,而不是生成自定义控件。
考虑到您希望显示一棵家谱,应该可以直接在标准WPF控件中执行此操作。
完全展开的TreeView控件可用于显示家谱。 乔什·史密斯(Josh Smith)撰写了一些文章,介绍如何将其布局更改为可以适应您的需求的家谱常用的布局: http : //www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx
如果您仍然想学习如何开发自定义控件,那么对于第一个自定义控件而言,选择一个比家族树控件更容易的方法。
您正在寻找的是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
。 总是在ArrangeOverride
完成后调用OnRender
并且可以访问子级的实际位置。
有关详细的教程,请使用“ WPF面板教程”或“ WPF自定义面板教程”。 这看起来不错 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.