繁体   English   中英

WPF编写自定义控件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM