WPF编写自定义控件

时间:2010-04-13 18:39:33

标签: wpf custom-controls

我想写一个自定义控件来显示一个家族树......所以我看了一下FamilyShow ......

所以他们的控件继承了FrameworkElement,但随后每件事都变得非常复杂......有没有简单的教程可以展示如何用子代实现自定义FrameworkElement等等?

基本上我没有做的就是这个,添加子控件并显示它们,并在绘制时获取子控件的坐标...

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

完全展开的TreeView控件可用于显示族树。 Josh Smith有一些文章如何将其布局更改为您可以根据自己的需求适应家谱的常用内容:http://www.codeproject.com/KB/WPF/CustomTreeViewLayout.aspx

如果您仍想学习如何开发自定义控件,请为您的第一个自定义控件选择一些比家族树控件更容易的东西。

答案 2 :(得分:1)

您要找的是Panel:它已经公开了Children类型UIElementCollection的属性,所以您需要做的就是添加子项并覆盖两种方法:< / p>

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